1、Widget
Widget是个抽象类,定义如下:
@immutable
abstract class Widget extends DiagnosticableTree {
const Widget({ this.key });
final Key key;
@protected
Element createElement();
static bool canUpdate(Widget oldWidget, Widget newWidget) {
return oldWidget.runtimeType == newWidget.runtimeType
&& oldWidget.key == newWidget.key;
}
}
说明:
(1)Key: 这个key属性主要的作用是决定是否在下一次build时复用旧的widget,决定的条件在canUpdate()方法中。
(2)canUpdate(...)是一个静态方法,它主要用于在Widget树重新build时复用旧的widget。只要newWidget与oldWidget的runtimeType和key同时相等时就会用newWidget去更新Element对象的配置,否则就会创建新的Element。
(3)StatelessWidget和StatefulWidget是Widget常用的两个子类,他们两也是abstract抽象类。
2、StatefulWidget
abstract class StatefulWidget extends Widget {
const StatefulWidget({ Key key }) : super(key: key);
@override
StatefulElement createElement() => new StatefulElement(this);
@protected
State createState();
}
说明:
(1)一个StatefulWidget类会对应一个State类,State表示与其对应的StatefulWidget要维护的状态。本质上就是一个StatefulElement对应一个State实例。
(2)当State被改变时,可以手动调用其setState()方法通知Flutter framework状态发生改变,Flutter framework在收到消息后,会重新调用其build方法重新构建widget树,从而达到更新UI的目的。
3、State生命周期
(1)举个生命周期例子
(a)首次启动StatefulWidget,生命周期执行如下:
initState
didChangeDependencies
build
(b)然后点击热重载按钮,生命周期执行如下:
reassemble
didUpdateWidget
build
(c)在widget树中将当前StatefulWidget移除,然后热重载,生命周期执行如下:
reassemble
deactivate
dispose
(2)生命周期方法说明