颤振发展——[14-状态管理]
浏览:1023 次

我为什么需要国家管理?
1.1.了解状态管理
许多人一开始就不适合从命令式编程框架(Android或iOS原生开发者)切换到声明式编程(Flutter、Vue、React等),因为需要一个新的视角来考虑APP的开发模式。
作为一个现代框架,Flutter是声明式编程:
在编写app的过程中,我们需要管理大量的状态,而更新界面刷新需要改变这些状态:
1.2.不同州的管理分类
1.2.1.星历状态
某些状态只需要在您自己的Widget中使用
例如,我们前面制作的简单计数器
例如,PageView组件记录当前页面
例如,记录当前进度的动画
例如,BottomNavigationBar中当前选定的选项卡
我们只需要使用StatefulWidget对应的State类来管理这个状态。小工具树的其他部分不需要访问此状态。
1.2.2.app状态
在开发过程中,还有许多状态需要在多个部分中共享
例如,用户的个性化选项
例如,用户的登录状态信息
例如,电子商务app的购物车
例如,新闻app的已读消息或未读消息
如果我们将这种状态从一个小部件传递到另一个小,它将是无止境的,代码耦合将变得非常高,这将影响整个身体。无论是代码编写质量、后期维护、可扩展性,都很差。
此时,我们可以选择全局状态管理方法来统一管理和应用状态。
1.2.3.如何选择不同的管理方法
在开发中,没有明确的规则来区分哪些状态是短期的,哪些是应用状态。
一些短期状态可能需要在未来的开发和维护中升级为app状态。
但我们可以简单地遵循以下流程图的规则:
经验法则是选择能减少麻烦的方法。
二、共享状态管理
2.1.继承的Widget
React中的InheritedWidget和上下文具有类似的功能,可以跨组件传输数据。
定义一个InheritedWidget共享数据,该数据需要从inherited Widget继承
这里,定义了一个of方法,它开始通过上下文搜索祖先的HYDataWidget(您可以查看源代码搜索过程)
updateShouldNotify方法用于将新的HYDataWidget与旧的HYData Widget进行比较,并确定是否更新相关的依赖小部件
类HYDataWidget扩展InheritedWidget{
最终int计数器;
HYDataWidget({this.counter,Widget child}):super(child:child);

(BuildContext上下文)的静态HYDataWidget{
return context.dependOnInheritedWidgetOfExactType();
}
@超驰,超越
bool updateShouldNotify(HYDataWidget旧Widget){
返回这个。计数器!=oldWidget.counter;
}
}
创建HYDataWidget并输入数据(单击此处的按钮修改数据并重建)
类HYHomePage扩展StatefulWidget{
@超驰,超越
_HYHomePageState创建状态()=>_ HYHome PageState();
}
class _ HYHomePageState扩展状态{
int数据=100;
@超驰,超越
小工具生成(BuildContext上下文){
返回脚手架(
应用栏:应用栏(
title:文本(“InheritedWidget”),
),
正文:HYDataWidget(
计数器:数据,
child:中心(
child:列(
main轴对齐:Main轴对齐.center,
儿童:<小工具>[
HYShowData()
],
),
),
),
floatingActionButton:浮动操作按钮(
child:图标(Icons.add),
按下:(){

设置状态((){
data++;
});
},
),
);
}
}
在小部件中使用共享数据并侦听
2.2.供应商
Provider是官方推荐的全局状态管理工具。在使用它之前,我们需要介绍它的依赖性,
依赖关系:
提供程序:^4.0.4
2.2.1.提供商的基本使用
在使用提供者时,我们主要关注三个概念:
ChangeNotifier:存储真实数据(状态)的位置
ChangeNotifierProvider:在小部件树中提供数据(状态)的地方,将创建相应的ChangeNotifier
消费者:需要在Widget树中使用数据(状态)的位置
让我们首先完成一个简单的案例,并使用提供者来实现官方的反案例:
步骤1:创建自己的ChangeNotifier
我们需要一个ChangeNotifier来保存我们的状态,所以创建它
在这里,我们可以使用ChangeNotifier的继承,也可以混合使用,这取决于概率是否需要从其他类继承
我们使用private_Counter,并提供getter和setter
在setter中,我们听到_如果计数器发生变化,请调用notifyListeners方法通知所有Consumer进行更新
类CounterProvider扩展ChangeNotifier{
整数计数器=100;
int获取计数器{
返回计数器;
}
设置计数器(int值){
_计数器=值;
notifyListeners();
}
}
步骤2:在小部件树中插入ChangeNotifierProvider