Flutter知识点记录
2019-11-06 本文已影响0人
白茫茫的大地
问题
dart的单线程模式怎么保证不阻塞UI的
Dart的线程模型是什么样子的,
State的生命周期到底是什么样子的呢,单独的设置某个地方的状态变化怎么办呢,大名鼎鼎的 redux 是一个怎么样的库,在你现在的开发中哪里能用到呢?
Widget是啥,里面的key字段有什么用处?Element又是个啥?
Widget
Widget并不等于View,在Flutter当中,Widget是用来描述UI的不可变数据结构。
先看源码:
@immutable
abstract class Widget extends DiagnosticableTree {
const Widget({ this.key });
final Key key;
@protected
Element createElement();
@override
String toStringShort() {
return key == null ? '$runtimeType' : '$runtimeType-$key';
}
@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
super.debugFillProperties(properties);
properties.defaultDiagnosticsTreeStyle = DiagnosticsTreeStyle.dense;
}
static bool canUpdate(Widget oldWidget, Widget newWidget) {
return oldWidget.runtimeType == newWidget.runtimeType
&& oldWidget.key == newWidget.key;
}
}
首先看顶部的注解:@immutable
,这就表明Widget是不可变的,所以Widget没有任何可变的状态,所有的字段都应该是final。再来看下里面的canUpdate
方法:
static bool canUpdate(Widget oldWidget, Widget newWidget) {
return oldWidget.runtimeType == newWidget.runtimeType
&& oldWidget.key == newWidget.key;
}
源码中只提供了key
这个字段,Flutter当中key用来控制Element树当中新旧Widget的替换
。Flutter通过canUpdate
判断,如果两个Widget的runtimeType及key都是相等的,其所对应的Element就会用新的Widget替换旧的Widget(通过调用Element.update,传递新的Widget),否则,旧的Element要从树中移除,新的Element要添加到树当中。
Flutter提供的容器类Widget
有StatelessWidget
及StatefullWidget
,这两者可以管理一组Widget.
StatelessWidget
StatelessWidget是无状态的Widget
。StatelessWidget提供了build
方法,通过build方法构建一组Widget
来更具体地描述UI的一部分。整个Widget树的构建过程是递归的,直到生成一棵完整具体的UI描述树。框架会用build方法生成的一组widgets替换(更新或者删除)该widget自己的子树,
abstract class StatelessWidget extends Widget {
const StatelessWidget({ Key key }) : super(key: key);
@override
StatelessElement createElement() => StatelessElement(this);
@protected
Widget build(BuildContext context);
}
在看一下上面的源码,该部分UI的描述完全可以由该Widget自己的配置信息及构建上下文(BuildContext,即该Widget自己对应的Element)描述,不依赖其它任何外部信息。所以它是无状态的
。
build
方法的调用有三种时机
- StatelessWidget第一次插入到树中时(其所对应的Element首次插入到Element树中时)
- 父对象改变了StatelessWidget的配置
- 依赖的InheritedWidget发生改变