生命周期
- 就是一连串的回掉方法(函数)。
作用
- 监听widget 的事件
- 初始化数据
** 创建数据
** 发送网络请求 - 内存管理
** 销毁数据,监听者,Timer 等
Widget的生命周期
- Stateless
** 1. 构造方法
** 2. bulid 方法
*Stateful(包含widget ,和state)
** Widget 的构造方法
** Widget 的CreateState
** State 的构造放过
** State 的initState 方法
** State 的build 方法
** void deactivate() { } 将要销毁的时候
** Dispose 方法(Widget 消失的时候)
** didChangeDependencies(){}改变数据用的 下面是代码的例子。
class MyData extends InheritedWidget 相当于是iOS NSUserDefault 的数据存储。但是这个会在 children: <Widget>[
MyData(data: _counter ,child: Test1()),
],
在这个节点的时候会销毁
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyData extends InheritedWidget{
int? data;
MyData({this.data,required Widget child}) : super(child: child);
static MyData? of(BuildContext context){
return context.dependOnInheritedWidgetOfExactType();
}
@override
bool updateShouldNotify(MyData oldWidget) {
// TODO: implement updateShouldNotify
return oldWidget.data != data;
}
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
MyData(data: _counter ,child: Test1()),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
class Test1 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Test2();
}
}
class Test2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Test3();
}
}
class Test3 extends StatefulWidget {
@override
_Test3State createState() => _Test3State();
}
class _Test3State extends State<Test3> {
@override
Widget build(BuildContext context) {
return Container(
child: Text(MyData.of(context)!.data.toString()),
);
}
@override
void didChangeDependencies() {
// TODO: implement didChangeDependencies
super.didChangeDependencies();
}
}
Widget 的渲染
- 并不是所有的Widget 都会被独立渲染,只有继承RenderObjectWidget 的才会创建RanderObject 对象。
- Widget 树 Element 树 render树
- 没有一个Widget 都会创建一个element 隐式调用creatElement 方法,Element 加入Element 树(三种Element,renderElement ,stateLess ,statefull)
renderElement
** renderelement 主要创建RenderObjcet对象
** Flutter 调用mount 方法,creatRenderObjdect 方法
stateLess
** 继承CommponentElement 方法。
** CommponentElement 会调state 用build() 方法来将element 作为参数刷新数据。
statefull
** 继承CommponentElement 方法。
** 调用createState 方法 将Wiget 复制给state
** CommponentElement 会调state 用build() 方法来将element 作为参数刷新数据。