Flutter 学习笔记
Dart
官方文档:https://dart.cn/guides/language/language-tour
变量
const 和 final 的区别
const
值在编译时确定,final
值在运行时确定。
方法
函数简写
如果函数体只有一个表达式,则函数可以简写为:
bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;
参数
Dart 函数的参数有两种形式:必要参数和可选参数。必要参数位于所有参数的前面,可选参数则位于必要参数的后面。
如果一个函数声明里面有多个可选参数,那么调用方如何确定某个可选参数值是准确传给了目标参数呢?
Dart 里面将可选参数分为了两种:可选命名参数和可选位置参数。
可选命名参数
使用{}
将方法的某些参数划为可选命名参数。
可选命名参数通过在调用时明确给出目标参数的名字,来准确定位参数传递。
void getDetail(String name, {String branch = "master"}) {
}
void test() {
// 这里明确指定了 "release" 是传给 branch 参数的
getDetail("name", branch: "release");
}
如果习惯了 Swift 或者 Objc 里面调用方法时都会带上所有参数的名字,比如:
func test(name: String, branch: String, msg: String = "empty") {
}
test(name: "name", branch: "master")
那么在可选命名参数前面加上required
就可以了。被特别标记为required
的参数不再是可选参数,而是调用时必须给出该参数的名字:
// 这里的 branch 不是可选参数,而是必要参数,且在调用时必须把参数名写出来
void getInfo(String name, {required String branch, String msg = "empty"}) {
print("branch is " + branch);
print("msg is " + msg);
}
void main(List<String> args) {
getInfo("name", branch: "master")
}
可选位置参数
使用[]
将方法的某些参数划为可选位置参数。
可选位置参数基于可选参数们的先后顺序,来确定参数值是传递给哪一个可选参数的。
void getInfo(String name, [String branch = "master", String msg = "empty"]) {
print("branch is " + branch);
print("msg is " + msg);
}
void main(List<String> args) {
// 这里的 "release" 是传递给 branch 参数的。
// 因为 branch 参数的位置先于 msg
getInfo("name", "release");
}
// 输出
// branch is release
// msg is empty
Flutter
Widget
Flutter 中一切用于显示的都是 Widget。Widget 又分为无状态 StatelessWidget
和有状态 StatefulWidget
两种。
Widget 之间通过child
或children
嵌套。
StatelessWidget
StatelessWidget 在创建之后不会更改。
StatefulWidget
StatefulWidget 通过一个State<T>
来驱动 Widget 重新构建刷新。
State 的生命周期如下图:
其中:
- initState() 只会调用一次,类似于 iOS 中的 viewDidLoad().
- didChangeDependencies() 可以调用多次。在 initState() 后会立即调用一次;之后当依赖的 InheritedWidget rebuild 时也会再调用一次。
- build() 是(重新)绘制 Widget 时会调用。
- didUpdateWidget() 在组件状态发生变化时调用。一般情况下,父 Widget 调用 setState() 后,子 Widget 就会调用 didUpdateWidget() 方法。
- deactivate() 是当 State 要被移除出树中时调用。但调用这个方法不代表这个 State 对象要被销毁了,因为被移除出树的 State 是能再加回来的。
- dispose() 是当 State 要被销毁时调用的。