郑州网站建设最低价,最近的新闻内容,互联网公司的招聘要求,下载正品官方网站1、为了更好地了解状态管理#xff0c;先看看什么是状态。
在类似Flutter这样的响应式编程框架中#xff0c;我们可以认为U相关的开发就是对数据进行封装#xff0c;将之转换为具体的U1布局或者组件。借用Flutter官网的一张图#xff0c;可以把我们在第二部分做的所有开发…1、为了更好地了解状态管理先看看什么是状态。
在类似Flutter这样的响应式编程框架中我们可以认为U相关的开发就是对数据进行封装将之转换为具体的U1布局或者组件。借用Flutter官网的一张图可以把我们在第二部分做的所有开发都抽象为下图所示的过程。 2、状态即为数据
Flutter框架通过build方法將我们拥有的数据”也就是状态转换成了具体的页面内容Fiutter官方将这些状态划分为了两种不同的类型短时(ephemeral 状态与应用(app状态。所谓短时状态是指包含在单个widget中且不会与其他widget共享的状态应用状态则相反是指会在多个Widget之间共享的状态。没太明白没关系这里我们只要理解状态即为数据就可以了。
3、响应式编程与命令式编程
传统的GUI编程框架例如iOS的UIKit和 Android的SDK 都属于命令式编程风格。所谓命令式编程是指需要使用类似button.text“hello world” 这样的方式来修改一个按钮上的文本。命令式编程的好处在于代码比较直观且易于理解问题在于开发者很难将众多命令式的代码和实际的用户界面关联起来。而Flutter这种响应式编程框架很好地解决了这个问题在响应式编程框架中可以很容易地将代码与实际的用户界面关联起来例如Flutter中的build方法里的代码很容易就可以和实际的用户界面相关联只是在响应式编程框架中我们一般不会直接通过获取button对象的方式修改按钮上的文本而是通过修改button对象对应的状态来修改即框架替我们完成了修改状态后更新button对象的工作。
4、维基百科-状态管理定义
〝状态管理指的是在图形用户界面中对于和用户界面中类似文本框、按钮这样的组件所对应的状态的管理方式。…尤其指代某个页面需要和其他多个页面共享状态的场景一一维基百科
根据维基百科的定义我们不难得出状态管理面临的问题其实就是如何在复杂的页面中管理大规模尤其是跨页面或者说在Flutter中跨widget的数据共享。从逻辑上讲可以将Flutter中跨widget的状态共享分成下图中的三种情况。 在状态管理的范畴中解决widget之间状态共享问题的通用思路也很简单单一一提高状态的层级。也就是说如果widget之间需要共享状态就把这个状态提升到这两个widget的共同祖先widget中将这个短时状态转变为应用状态。
4、结论
总而言之得出这样一个结论Flutter中状态管理所要解决的最根本的问题就是如何在任意一个widget中获取某一个应用状态。接下来我们会逐步分析如何在Flutter的框架体系中解决这个问题。
5、Flutter中的状态管理
在不引入任何新概念的前提下要想从子Widget获取其父Widget中的状态有以下两种简单的实现方式 通过构造方法将父widget中的状态传递给子Widget; 把父widget的状态层级大幅度提高使该状态成为一个全局的单例对象在任何地方都可以获取到它。
6、5中的缺点
在业务逻辑比较简单的情况下使用这两种方式都不会出现太多的问题可是一旦业务逻辑变得复杂这两种方式就有可能力不从心了。
1.针对第一种方式如果需要跨越多个层级传递数据那么可以想象得到对于整个层级的每一个widget中的构造方法都需要添加对应的构造参数需要跨越的层级越深我们的代码就越丑陋。2.对于第二种方式当需要共享的状态仅和个别页面相关联时全局的单例对象会导致很多额外的开销。例如我们可能只需要在某个子页面记录某个按钮是否可用如果用一个单例对象存储按钮是否可用的状态那么在页面被销毁后还需要销毁单例对象中存储的对应状态对应否则单例对象中会存在很多这样的无用状态。
以上两种方式虽然在具体实现中都出现了问题但这些问题其实并不是方式方面的问题而只是代码工程化方面的。 实际上Flutter官方推荐的状态管理实现方式基本上就是基于这两种方式的工程化优化和实现。
7、原理
inheritedwidget和inheritedModel正是对第一种方式的工程化优化Provider和Scoped Model则是对inherited widget的AP1封装让我们能够少写一些重复度比较高的代码。BIoC仅仅是提供了一个组织逻辑代码和U代码的思路其实际实现–flutter_bloc则是基于Provider包实现的。RxDart只是修改了B1oC中一部分 逻辑代码的编写方式并没有在机制上逃出Inheritedwidget的范畴。Redux的层次和BIoC类似只是给出了一个组织代码的方式和思路它的一个实际实现一—fish_redux中也是利用inheriteawidget实现的。
8、如何使用Inherited Widget和其原理 后续补充 9、使用Provider包完成状态管理 主流