要学习Flutter,先熟悉一下Dart总是有益的。Dart中文网传送门
在线测试传送门
看此篇文章是java熟悉者会比较容易
- main()
- main()在dart里面是必须的一个函数,是应用的入口,
- dart 声明对象
//1、使用var ,让程序去推断类型
var name = "hello ppx";
//2、使用具体的类型,有趣的是:如果不给int age赋值,那么打印出来的age将是null,而不是像Java中是0,因为dart中一切皆对象
int age = 12;
//任何类型
dynamic a = "";
dynamic b = 1;
- Dart 没有关键字 “public” , “protected” 和 “private” 。 如果标识符以下划线(_)开头,则它相对于库是私有的。每个 Dart 应用程序都是一个库
- await 相当于async 异步操作时使用的关键字
- 异步函数
//普通函数
String lookUpVersion() => '1.0.0';
//异步函数
Future<String> lookUpVersion1() async => '1.0.0';
- Dart 语言支持以下内建类型:
- Number(包括int和double)
- String
- Boolean
- List (也被称为 Array)
- Map
- Set
- Rune (用于在字符串中表示 Unicode 字符)
- Symbol
- 可选参数分为,命名可选参数和位置可选参数
//命名可选参数,调用时(就是普通认知里面的调用而已
testFun(true, true);
//命名可选参数,定义时(也是普通认知里面的定义而已)
void testFun2(bool a) {}
//位置可选参数,定义时用[]包起来就是
//定义位置可选参数的时候,有一个非空判断 ,要么给位置可选参数的类型后面加上问号,定义成可空变量;
// 要么在参[]前面加上注释@required ,定义成必须可选参数。
// 但是这样的话感觉这个可选参数都没有意义了,,既然是必选那何必加在[]里面呢
void testFun3(bool a, @required [String device])
{}
//调用位置可选参数
testFun3(true, "666");
void testFun4(bool a, [bool? b]) {
}
//调用位置可选参数
testFun4(true);
testFun4(true, false);
运算符
- 算数运算符:+ - * / ~/ % ++ –
- 以上分别对应加减乘除,取整和取余,还有自增和自减
- 关系运算符:== 、 != 、> 、< 、>=、<=
- 类型判定运算符:as 、is 、is!
- 赋值运算符:= 、 ??= ,以及多种复合赋值运算符 +=、-=、/=、*=、%=、>>=、^=、~/=、<<=、&=、|=
- ??= 是当变量在为空的情况下才给他赋值
- 逻辑运算符:&&、||、!
- 按位和移位运算符:&、|、^、~、<<、>>
- 级联运算符:…
//相当于链式调用,例如
querySelector('#confirm') // 获取对象。
..text = 'Confirm' // 调用成员变量。
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
控制流程语句
- if 和 else
- for 循环
- 只额外记一种即可:for in
var collection = [0, 1, 2]; for (var x in collection) { print(x); // 0 1 2 }
- while 和 do-while
- break 和 continue
- switch 和 case
异常
- throw
- catch :捕获异常,on指定异常类型, catch 来 捕获异常对象。catch的参数可以有一个或两个,两个的时候第二个是堆栈信息( StackTrace)
try {
breedMoreLlamas();
} on OutOfLlamasException {
// 一个特殊的异常
buyMoreLlamas();
} on Exception catch (e) {
// 其他任何异常
print('Unknown exception: $e');
} catch (e ,s) {
// 没有指定的类型,处理所有异常
print('Something really unknown: $e');
}
- finally
类
- 构造函数
//常量构造函数,const+函数名称
var p = const ImmutablePoint(2, 2);
- 扩展类
- 重写操作符:以下操作符均可被重写
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MxkMhb13-1629447910503)(https://s3.bmp.ovh/imgs/2021/08/36d0e9446ce2e1c2.png)] - 例如:重写 + 运算符
class Vector { final int x, y; Vector(this.x, this.y); Vector operator +(Vector v) => Vector(x + v.x, y + v.y); Vector operator -(Vector v) => Vector(x - v.x, y - v.y); // 运算符 == 和 hashCode 部分没有列出。 有关详情,请参考下面的注释。 // ··· } void main() { final v = Vector(2, 3); final w = Vector(2, 2); assert(v + w == Vector(4, 5)); //相当于将两个Vector分别带入上面表达式 assert(v - w == Vector(0, 1)); }
- 重写操作符:以下操作符均可被重写
- 复用类代码:Mixin,重点就是with后面的类会覆盖前面的类的同名方法
- 举个栗子:
class A { String getMessage() => 'A'; } class B { String getMessage() => 'B'; } class P { String getMessage() => 'P'; } class AB extends P with A, B {} class BA extends P with B, A {} void main() { String result = ''; AB ab = AB(); result += ab.getMessage(); BA ba = BA(); result += ba.getMessage(); print(result);//打印BA }
- 处理 Future
- 可以通过下面两种方式,获得 Future 执行完成的结果:
- 使用 async 和 await.
- 使用 Future API,具体描述,参考 库概览.
await使用的时候 方法必须被标记为async
- 处理 Stream
- 当需要从 Stream 中获取数据值时, 可以通过一下两种方式:
- 使用 async 和 一个 异步循环 (await for)。
- 使用 Stream API, 更多详情,参考 in the library tour。
- 生成器
- 当您需要延迟生成( lazily produce )一系列值时, 可以考虑使用_生成器函数_。 Dart 内置支持两种生成器函数:
- Synchronous 生成器: 返回一个 Iterable 对象。
- Asynchronous 生成器: 返回一个 Stream 对象。
- 所有 Dart 代码都在隔离区( isolates )内运行,而不是线程。 每个隔离区都有自己的内存堆,确保每个隔离区的状态都不会被其他隔离区访问。