前言
终有一天,学习变得很慢,坚持变得很难。希望心底的那团火能让你浴火重生。觉醒吧,不屈的少年!前面星辰大海,前面是诗和远方!
环境
Dart因Flutter而生,自然也伴随Flutter一路。安装好Flutter环境后,便可开始学习Dart之旅。
// ethan@B85MK:~/Flutter/Dart$ cat hello_world.dart
var name = 'I am nobody.';
void main() {
print('Hello,World!');
print( name );
}
ethan@B85MK:~/Flutter/Dart$ dart run hello_world.dart
Hello,World!
I am nobody.
杂记
shorthand arrow
举例
int sum_traditional(int x, int y) {
return x + y;
}
int sum_shorthand_arrow(int x, int y) => x + y;
void main() {
print('traditional : 1 + 1 = ' + sum_traditional(1, 1).toString());
print('arrow : 1 + 1 = ' + sum_shorthand_arrow(1, 1).toString());
}
输出
traditional : 1 + 1 = 2
arrow : 1 + 1 = 2
Nullable
举例
void main() {
int a = null;
print(a);
}
输出
ethan@B85MK:~/Flutter/Dart$ dart run nullable.dart
nullable.dart:2:13: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
int a = null;
^
讲解
null
跟C语言的含义并不一样。在C语言,null
是一个常量,其值等于0。而Dart语言是空,表示该变量不分配内存。上述例子,int a
表示创建变量a,并分配内存。再取消分配内存,是不允许的。如果需要赋值null
,请用int? a
创建。
举例
ethan@B85MK:~/Flutter/Dart$ cat -n nullaware.dart
1 void main() {
2 int? a; // = null
3 a ??= 3;
4 print(a); // <-- Prints 3.
5
6 a ??= 5;
7 print(a); // <-- Still prints 3.
8 }
输出
nullaware.dart:6:5: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
a ??= 5;
^
3
3
讲解
解释一下这个Warning。该代码第3行明显赋值了。故而,第6行再测试是否为空再赋值变得多余。编译器会认为该操作可能不符合程序员的预期,所以警告。
Exceptions
举例
void main() {
final numbers = <int>[2, 2, 7, 10];
try {
try {
var result = numbers.singleWhere((element) => element > 5);
print(result);
} on StateError catch (e) {
print("StateError found!");
rethrow;
} finally {
print("End0");
}
} catch (e) {
print(e);
} finally {
print("End1");
}
}
输出
$ dart run single_where.dart
StateError found!
End0
Bad state: Too many elements
End1
解释
singleWhere
方法在遇到符合条件的元素超过1个或者没有的情况下会抛出错误StateError
。同时,这里展示了rethrow
的使用。
Class
举例
Iterable<User> filterOutUnder40(Iterable<User> users) {
return users.where((user) => user.age < 40);
}
Iterable<User> findShortNamed(Iterable<User> users) {
return users.where((user) => user.name.length <= 7);
}
class User {
String name;
int age;
User(
this.name,
this.age,
);
}
void main() {
Iterable<User> users = [
User("EthanChou", 33),
User("JackyHe", 41),
User("EllenSheng", 38)
];
print("Users under 40");
var usersUnder40 = filterOutUnder40(users);
for (final element in usersUnder40 ) {
print(element.name);
}
print("");
print("Users with short name");
var usersWithShortName = findShortNamed(users);
for (final element in usersWithShortName) {
print(element.name);
}
}
讲解
此代码是dart.dev
网站一道练习题的答案。对于基础比较低笔者来说,还是比较有挑战性的。
Iterable<User>
的初始化filterOutUnder40
和findShortNamed
是两个函数。
async
举例
Future<void> printOrderMessage() async {
print('Awaiting user order...');
var order = await fetchUserOrder();
print('Your order is: $order');
}
Future<String> fetchUserOrder() {
// Imagine that this function is more complex and slow.
return Future.delayed(const Duration(seconds: 4), () => 'Large Latte');
}
void main() async {
countSeconds(4);
await printOrderMessage();
}
// You can ignore this function - it's here to visualize delay time in this example.
void countSeconds(int s) {
for (var i = 1; i <= s; i++) {
Future.delayed(Duration(seconds: i), () => print(i));
}
}
输出
$ dart run future_async.dart
Awaiting user order...
1
2
3
4
Your order is: Large Latte
解释
网文说,Dart
是一个单线程模型。异步机制替代多线程,简化多线程编程。上述代码中,Future
是SDK封装的类。await
会等待异步代码完成,从而异步变同步。