flutter3 状态管理
Whiget State Manage
- widget 被创建出来就是没有状态的,因其使用的是增量渲染的方式,替换掉有改变的widget
问题:需要保留原来的数据怎么办呢? 这就涉及到今晚的重磅 有状态的Widget
state widget
-
渲染逻辑 和 数据逻辑 分开管理
- 保留数据逻辑,不保留渲染逻辑
-
state widget for StatefulWidget
StatefulWidget
- StatelessWidget 改为 StatefulWidget
class SharedCenter extends StatelessWidget{}
改为
class SharedCenter extends StatefulWidget{}
-
重点 需要将自定义的MyApp类装入State, 如:State<MyApp>
- Home 里面的内容必须全是StatefulWidget
- 实时动态 setState((){});
-
floatingActionButton 悬浮按钮的使用
// MyApp
class KWidgetStateManage extends StatefulWidget {
const KWidgetStateManage({Key? key}) : super(key: key);
@override
State<StatefulWidget> createState() => _KStateManage();
}
// 状态管理者
class _KStateManage extends State<KWidgetStateManage>{
static num count = 0;
@override
Widget build(BuildContext context) {
// TODO: implement build
return MaterialApp(
debugShowMaterialGrid: false,
debugShowCheckedModeBanner: false, // 清除斜杠
home: Scaffold(
backgroundColor: Colors.white,
appBar: AppBar(title: const Text('hello flutter'),),
body: Center(
child: Chip(label: Text('state flutter $count'),)
),
floatingActionButton: FloatingActionButton(onPressed: (){setState((){
count+=1;
});},child: const Icon(Icons.add),),
),
);
}
}
---------------------------------------------------
main.dart中
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget{
// key 保证了唯一定位,解除了增量渲染可能带来的bug
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
// TODO: implement build
return const KWidgetStateManage();
}
}
总结:
- 1.状态管理类需要设置为私有不给外界访问,外界只能访问StatefulWidget拓展的类(class)
- 2.状态管理类继承了 State<这里是自定义的
StatefulWidget拓展的类
> - 3.Home widget的设置需要在
状态管理类
的内部,否则无法做到实动态更新 - floatingActionButton的onPressed 添加回调函数(){}
- floatingActionButton 的回调函数中 添加setState 以便实时状态更新
- 6.由于flutter的渲染机制是增量渲染,所以需要key保证节点渲染的唯一性,可以理解为每添加一个构造方法key自增的过程,通过找到相对应的key实现替换witget并渲染新的widget(即
O1的过程
,所以很快,女孩子一般不太喜欢)
网友评论