管理状态的最常见的方法:
方法 | 描述 |
---|---|
自身状态管理 | Widget管理自己的状态。 |
父组件管理子组件状态 | 父Widget管理子Widget状态。 |
混合管理 | 混合管理(父Widget和子Widget都管理状态)。 |
全局状态管理 | 使用第三方库进行全局状态管理 |
关于状态管理原则:
- 如果状态是用户数据,如复选框的选中状态、滑块的位置,则该状态最好由父Widget管理。
- 如果状态是有关界面外观效果的,例如颜色、动画,那么状态最好由Widget本身来管理。
- 如果某一个状态是不同Widget共享的则最好由它们共同的父Widget管理。
在Widget内部管理状态封装性会好一些,而在父Widget中管理会比较灵活。有些时候,如果不确定到底该怎么管理状态,那么推荐的首选是在父widget中管理(灵活会显得更重要一些)。
一. 组件自身管理自身状态
自己管理自己的状态比较简单, 参数在组件内部 , 同时 setState也在自己内部
![](https://i-blog.csdnimg.cn/blog_migrate/f979feb86c6fae5e65180d33bec6cfad.gif)
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("组件自己管理自己状态"),
),
body: SelfWidget(),
);
}
}
class SelfWidget extends StatefulWidget {
@override
_SelfWidgetState createState() => _SelfWidgetState();
}
class _SelfWidgetState extends State<SelfWidget> {
bool _isActive = false;
_handleTap() {
setState(() {
_isActive = !_isActive;
});
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: _handleTap,
child: Container(
width: