感悟
Flutter
入门篇,想多说一些感慨:“没有必要准备充足再出发”。对未知、“新鲜”的技术领域,小伙伴们不忘初心,但忘记了出发。
自我设限的心理暗示只要你找,就肯定能找到一个,最常见的莫过于,没有准备好。每一个说中文的人,无论多么博学,都一定还存在不认识的汉字、存在不会写的笔画,但这些“不认识”、“不会写”,并不会带给你的人际沟通一点点阻碍。同时,没有准备好的困扰,事后证明,要么顺手攻克它,成为了能力圈的一部分,要么是“庸人自扰”的想象产物。
正式开始:
Java、Kotlin、Dart等语言的语法是大同小异的,但上手 Flutter
前,还是建议 “走马观花” 给自己做一下开发语言语法扫盲,磨刀不误砍柴工,这样写代码时就不会磕磕绊绊了。
=> 操作符
=> expr 语法是 { return expr; }
了解即可,不重要。曾经有个朋友钻牛角尖,说:为什么不是 “->”
。
不用怀疑,这个朋友,就是我自己。「捂脸大哭…」
可选参数
kotlin 等类script语言,是有这个可选参数的设定的,对于开发效率非常有帮助。在 面向程序员效率编程
上,Java
、C语言
等有一点不友好。
// 可选参数 定义
enableFlags({bool bold, bool hidden}) { // ... }
// 可选参数 调用
enableFlags(bold: true, hidden: false);
可选位置参数
String say(String from, String msg, [String device]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
return result;
}
assert(say('Bob', 'Howdy') == 'Bob says Howdy');
assert(say('Bob', 'Howdy', 'smoke signal') ==
'Bob says Howdy with a smoke signal');
默认参数值
/// Sets the [bold] and [hidden] flags to the values you
/// specify, defaulting to false.
void enableFlags({bool bold = false, bool hidden = false}) {
// ...
}
// bold will be true; hidden will be false.
enableFlags(bold: true);
级联语法 …
JavaScript
中有类似的语法设定,Dart抛却强类型设定,其余部分还是和Script
语言蛮像的。
querySelector("#sample_text_id")
..text = "Click me!"
..onClick.listen(reverseText);
构造方法
面向对象语言,不可不知的部分。
构造函数名字可以为 ClassName 或者 ClassName.identifier
命名构造函数
// Named constructor
Point.fromJson(Map json) {
x = json['x'];
y = json['y'];
}
常量构造函数
使用常量构造函数 可以创建编译时常量,要使用常量构造函数只需要用 const 替代 new 即可
var a = const ImmutablePoint(1, 1);
var b = const ImmutablePoint(1, 1);
assert(identical(a, b)); // They are the same instance!
为类添加功能: Mixin
Mixin
是复用类代码的一种途径, 复用的类可以在不同层级,之间可以不存在继承关系。
通过with
后面跟一个或多个混入的名称,来 使用Mixin
class Musician extends Performer with Musical {
// ···
}
class Maestro extends Person
with Musical, Aggressive, Demented {
Maestro(String maestroName) {
name = maestroName;
canConduct = true;
}
}
mixin Musical {
bool canPlayPiano = false;
bool canCompose = false;
bool canConduct = false;
void entertainMe() {
if (canPlayPiano) {
print('Playing piano');
} else if (canConduct) {
print('Waving hands');
} else {
print('Humming to self');
}
}
}
关于 异步 async
异步方法的执行可能需要一定时间,但是 异步方法立刻返回 - 在方法体还没执行之前就返回了
关于 阻塞 await
在await expression
中,expression
的返回值通常是一个Future
; 如果返回的值不是Future
,则Dart
会自动把该值放到Future
中返回。
Future
对象代表返回一个对象的承诺(promise)。await expression
执行的结果为这个返回的对象。
*注意:await expression 会阻塞住,直到需要的对象返回为止
Future
Future
对象代表返回一个对象的承诺 promise,这一点和JavaScript
很像。
* 注意:Future
非常重要,会单开一节。
Stream
Stream
代表一些列数据。 例如,HTML
按钮点击事件就可以使用stream
来表示。 还可以把读取文件内容当做一个 Stream。
Callable classes
如果 Dart 类实现了 call() 函数则 可以当做方法来调用
typedefs
在 Dart 中,函数也是对象,就想字符和数字对象一样。 使用 typedef ,或者 function-type alias 为函数起一个别名, 别名可以用来声明字段及返回值类型。
typedef Compare<T> = int Function(T a, T b);
int sort(int a, int b) => a - b;
void main() {
assert(sort is Compare<int>); // True!
}
* 注意:目前,typedefs 只能使用在函数类型上, 我们希望将来这种情况有所改变。
get/set 方法
实例对象的每一个属性都有一个隐式的 Getter 方法,如果为非 final 属性的话还会有一个 Setter 方法