颤振发展(14)-状态管理
浏览:897 次

状态管理是声明式编程的一个非常重要的概念。我们之前介绍过Flutter是声明式编程,它还将声明式编程与命令式编程区分开来。
在这里,我们将系统地学习Flutter声明性编程中非常重要的状态管理
我为什么需要国家管理?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的购物车
例如,新闻app的已读消息或未读消息
如果我们将这种状态从一个小部件传递到另一个小,它将是无止境的,代码耦合将变得非常高,这将影响整个身体。无论是代码编写质量、后期维护、可扩展性,都很差。
此时,我们可以选择全局状态管理方法来统一管理和应用状态。
1.2.3.在制定如何选择不同的管理方法时,没有明确的规则来区分哪些状态是短期的,哪些是应用状态。
一些短期状态可能需要在未来的开发和维护中升级为app状态。
但我们可以简单地遵循以下流程图的规则:
关于React使用setState或Redux中的存储来管理状态哪个更好的问题,Redux的作者Dan Abramov在Redux问题上回答如下:
经验法则是:做任何不那么尴尬的事
经验法则是选择能减少麻烦的方法。
II共享状态管理2.1.InheritedWidgetInherited Widget具有与React中的上下文类似的功能,可以实现跨组件数据的传输。
定义一个InheritedWidget共享数据,该数据需要从inherited Widget继承

这里,定义了一个of方法,它开始通过上下文搜索祖先的HYDataWidget(您可以查看源代码搜索过程)
updateShouldNotify方法用于将新的HYDataWidget与旧的HYData Widget进行比较,并确定是否更新相关的依赖Widget
类HYDataWidget扩展InheritedWidget{
finalint计数器;
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.ProviderProvider是官方推荐的全球状态管理工具,由社区作者Remi Rousselet和Flutter团队共同编写。
在使用它之前,我们需要介绍它的依赖性。截至本文,该提供商的最新版本为4.0.4:
依赖关系:
提供程序:^4.0.4
2.2.1.提供者的基本使用在使用提供者时,我们主要关注三个概念:
ChangeNotifier:存储真实数据(状态)的位置

ChangeNotifierProvider:在小部件树中提供数据(状态)的地方,相应的ChangeNotifier将