目录
吐槽
好久没写博客了,意识到自己的惫懒,内心相当愧疚……
日子不好混,作为Android的移动开发,在某公司日子一天比一天难过,app各大模块纷纷转用前端weex框架,native端移动开发几乎要失业了。
oschina都代码格式都不支持dart,很急。
前言
内心焦虑,于是想着学点什么充实下自己吧,前端框架的选择挺多的,weex是一个(资料是真的少……),另一个我颇为看好的就是Flutter。Flutter的主要语言是Dart (我真是气啊,为什么没个东西出来都要用一些奇奇怪怪的语言,你用python不行?你tensorflow怎么就用python呢!)。那么学习Dart的一些基本语法就是相当必要的了。另外,据说谷歌正在开发,不知道能不能取代Android的Fuchsia前端用的就是Flutter框架了。这都不学?等着被淘汰吗?
本文的后续内容完全是按照 https://codelabs.flutter-io.cn/codelabs/from-java-to-dart-cn/index.html#0 这里一点点写下来的,这里只是将知识点直接用注释的方式写入了dart代码中,更方便看而已,能够让一个java开发者急速了解dart的基础规则。
正文
demo1
class Bicycle {
//dart没有 private ,public 等关键字,默认都为public
int cadence;
// 前面加 _表示只读,并且private(仅在该文件内可用)
// 如果不设置初始值,默认是null
// *** 注意int类型默认也是null。***
int _speed = defalutSpeed;
int gear;
Bicycle(this.cadence, this.gear); // 等同于 Bicycle(int cadence,int gear){.....}
//默认的dart会为所有dart公开变量提供setter和getter方法
//非公开变量需要自己定义getter 和 setter方法
int get speed => _speed;
/*
* 只有一行代码的时候可以使用 =>
* 所有类都有toString方法。
* */
@override //重写关键字
//字符串可以使用单引号或者双引号。
//字符串内部可以使用 ${} 或者只是$ 进行格式化
String toString() => 'Bicycle: $_speed mph';
void applyBrake(int decrement) {
_speed -= decrement;
}
void speedUp(int increment) {
_speed += increment;
}
}
//在类中可以直接使用外部定义的变量。
int defalutSpeed = 100;
/**
* main() 方法是 Dart 的主方法,如果你需要访问命令行传递过来的参数。
* 可以使用 main(List<String> args 方法。
*
* 在 Dart 中你可以在类之外编写代码,变量、方法、存取方法都可以独立于类之外维持生命周期。
*
* */
void main() {
//new 关键字可选,变量用var声明,类型自动推断
// final变量用final声明 ,final var 必须省略成 final
final bike = Bicycle(2, 1);
print(bike.speed);
print(bike);
for (int i = 0; i < 5; i++) {
print('hello ${i + 1}');
}
}
正文2
import 'dart:math';
class Rectangle {
int width;
int height;
Point origin;
/**
* 敲黑板了,dart中经常使用这种定义,弄得人很懵.
* 嵌套在闭合的花括号中 ({}) ,用来表示它们是可选的命名参数。
* 这样的赋值代码表明给实例变量提供了默认的值。(必须有 {} )
* 甚至你可以使用类似 Rectangle(this.origin , {this.width = 0, this.height = 0}); 这样前边必选,后面可选
* 然后代码调用 Rectangle(const Point(10, 20), width: 100, height: 200) ,前面的参数没有名字
*/
Rectangle({this.origin = const Point(0, 0), this.width = 0, this.height = 0});
@override
String toString()=>'Origin: (${origin.x}, ${origin.y}), width: $width, height: $height';
}
main() {
//调用构造函数,但是对参数进行了选择。依稀记得kotlin中也有类似用法哦。
print(Rectangle(origin: const Point(10, 20), width: 100, height: 200));
print(Rectangle(origin: const Point(10, 10)));
print(Rectangle(width: 200));
print(Rectangle());
}
正文3
import 'dart:math';
//这里的abstract和java中的类似
abstract class Shape {
//相当于abstract方法,另外get关键字表示是一个get方法,实现可以直接 shape.area这样获取值。
num get area; //num是 数值类型的基类,有两个子类 int 和 double
num getAA(){return 1;}
}
//implements继承接口
class Circle implements Shape {
final num radius;
Circle(this.radius);
@override //关键字可以省略
num get area => pi * pow(radius, 2);
// 使用了implements关键字继承,相当于继承接口
// 必须重写,而且父类中的实现是被忽略的
@override
num getAA(){return 1;}
}
//使用 extends继承,和java中的继承一样。
class CircleMock extends Shape {
final num radius;
CircleMock(this.radius);
num get area => pi * pow(radius, 2);
}
//总结,使用implements和extends集成一个类是不同的
//dart只能有一个extends类,但是可以有多个interface和java一样
/**
* 可以看到,虽然circle是一个普通类,但是还是可以使用implements
* 但是circle内部所有的实现都被抛弃了,需要在子类重新实现
*/
class CircleMock2 implements Circle{
@override
num get area => null;
@override
num getAA() {
return null;
}
@override
num get radius => null;
}
class Square implements Shape {
final num side;
Square(this.side);
num get area => pow(side, 2);
num getAA(){return 1;}
}
Shape shapeFactory(String type) {
if (type == 'circle') return Circle(2);
if (type == 'square') return Square(2);
throw 'Can\'t create $type.'; //抛出错误
}
main() {
final circle = shapeFactory('circle');
final square = shapeFactory('square');
print(circle.area);
print(square.area);
}
结语
文档后面写的函数式编程是个鸡脖?? 质量太低了,所以这里省略了,因为如果你知道函数式编程,那么那篇文档就是废话,如果你不知道函数式编程,那么,那篇文档就是废话。等到后面进阶的时候补上dart的函数式编程吧。
看懂了上面的基本代码,你就可以说已经掌握了dart中常用的写法,但是在阅读代码过程中仍然会有很多让你困惑的内容,这是时候,如果你需要更全的语法规则,可以参考官方文档。
来源:oschina
链接:https://my.oschina.net/u/2398062/blog/2961389