生命周期¶
生命周期就是回调方法,封装好的Widget处于什么状态,抽象方法让你实现。
作用:
- 初始化数据
- 创建变量、常量
- 发送网络数据
- 监听小部件的事件
- 管理内存
- 销毁数据、销毁监听者
- 销毁timer等等
1、StatelessWidget¶
class LifeCycle extends StatelessWidget {
const LifeCycle({Key? key}) : super(key: key);
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return const Center(
child: Text('123'),
);
}
}
- StatelessWidget的构造方法
- StatelessWidget的bulid方法
2、StatefulWidget¶
class MyHomePage extends StatefulWidget {
final String? title;
MyHomePage({Key? key, this.title}) : super(key: key) {
print('StatefulWidget构造函数被调用了!');
} //构造方法
@override
_MyHomePageState createState() {
print('StatefulWidgetd的createState方法被调用了!');
return _MyHomePageState();
}
}
class _MyHomePageState extends State<MyHomePage> {
int _count = 0;
_MyHomePageState() {
print('State的构造方法被调用了!');
}
@override
void initState() {
print('State的init方法被调用了!');
super.initState();
//初始化数据。。。
}
//改变依赖关系
@override
void didChangeDependencies() {
// TODO: implement didChangeDependencies
print('State的didChangeDependencies被调用了');
super.didChangeDependencies();
}
@override
Widget build(BuildContext context) {
print('State的bulid方法被调用了!');
// return Center(
// child: Text(widget.title ?? '123'),
// ); // !强制解包 ??如果为空 用右边的
return Column(
children: [
ElevatedButton(
onPressed: () {
_count++;
// setState(() {});//等于下面
context as StatefulElement;
context.markNeedsBuild();
},
child: const Icon(Icons.add)),
Text('$_count') //staless就加const
],
);
}
@override
void dispose() {
print('State的dispose方法被调用了!');
super.dispose();
}
//State从渲染树中移除的时候调用
@override
void deactivate() {
// TODO: implement deactivate
print('State的deactivate方法被调用了!');
super.deactivate();
}
}
StatefulWidget¶
-
StatefulWidget的构造函数
-
createState方法
State¶
-
State的构造方法
-
initState
每次页面进来都走一次,创建state的时候走一次,切换页面会重新创建。解决内存,渲染树中会自动处理。
不要把部件创建放这里,这里面放数据,网络请求。
- didChangeDependencies方法
改变依赖关系
build方法之前
依赖(共享数据)的InheritedWidget发生变化之后,didChangeDependencies才会调用。
数据变了的处理。例如:点赞收藏等 需要保存 还需要请求网络
- State的bulid方法
build方法里面创建部件。
当调用setState方法,会重新调用Build进行渲染。
- deactivate
State从渲染树中移除的时候调用
- dispose方法:
void dispose()
页面切换销毁。释放资源。
- didUpdateWidget
@override
void didUpdateWidget(covariant IconWidget oldWidget) {
super.didUpdateWidget(oldWidget);
if (widget.typeCode != oldWidget.typeCode ||
widget.iconName != oldWidget.iconName) {
setState(() {
typeCode = widget.typeCode;
iconName = widget.iconName; // Reset iconName if needed
});
}
}
setState()方法¶
每次调用setState()方法更改状态都会重新走build方法
只要数据改变就手动调用一下,然后会调用build刷新UI,增量渲染。
setState方法内部主要是利用_element(本质就是context对象)调用markNeedsBuild
@protected
void setState(VoidCallback fn) {
/**
一系列判断
*/
_element!.markNeedsBuild();//标记需要被渲染
}
_element¶
context就是_element
BuildContext get context {
assert(() {
if (_element == null) {
throw FlutterError(
'This widget has been unmounted, so the State no longer has a context (and should be considered defunct). \n'
'Consider canceling any active work during "dispose" or using the "mounted" getter to determine if the State is still active.',
);
}
return true;
}());
return _element!;
}
StatefulElement? _element;
setState(() {});
//等于下面
context as StatefulElement;
context.markNeedsBuild();