flutter向 一文就够了 以声明式编程的角度理清到处都用的“状态state”是什么

前言

之前做Android开发,java语言搭配xml就从来没有听过状态, 但是在react,kotlin,flutter等等开发框架,开发方式中,都有状态这一概念,此文想依托flutter,对状态进行整理

参考

本文参考flutter中文社区官方文档

Flutter: 为所有屏幕创造精彩 - Flutter 中文开发者网站 - Flutter

正文

声明式编程思维

一个很出色的公式可以说明精髓

flutter向 一文就够了 以声明式编程的角度理清到处都用的“状态state”是什么_第1张图片

当Flutter 应用的状态发生改变时(例如,用户在输入了新的字符串),需要进行用户界面的重绘,在传统android开发中要使用widget.setText

声明式框架flutter追求的是改变了状态,那么用户界面将自动重新构建,就跟公式一样,自变量变化了,ui值也跟着要自动变化

使用声明式框架的我们只需要描述这个f函数,也就是state怎么构建ui的

短时 (ephemeral) 和应用 (app) 状态的区别

什么是状态?

广义上来讲:一个应用的状态就是当这个应用运行时存在于内存中的所有内容,包括了应用中用到的资源,所有 Flutter 框架中有关用户界面、动画状态、纹理、字体以及其他等等的变量

但是我们不需要管理一些状态(例如纹理),框架本身会替我们管理

所以更有用的定义是状态是“当任何时候你需要重建你的用户界面时你所需要的数据”

其次,我们需要自己管理的状态可以分为两种概念类型:短时 (ephemeral) 状态和应用 (app) 状态

短时状态

这里可以理解为完全包含在一个widget中的状态,如底部导航来确定当前显示哪个页面,这里我们只需要使用官方自带的StatefulWidget就可以了,其他widget不需要访问此状态,同时我们也不在意app关闭后,状态信息丢失

应用状态

如果你想在你的应用中的多个部分之间共享一个非短时的状态,并且在用户会话期间保留这个状态,我们称之为应用状态(有时也称共享状态)

在用户会话期间保留这个状态

举个例子:电商应用的购物车界面,假设我们对一个商品进行加购,然后希望点击结算的时候把现在的商品数量再统一发送给后台,那么如果我们没有点击结算,只是进行了加购行为,我们去逛逛别的页面,再来到这个页面,我们会发现我们的商品数量是不对的,因为加购的商品数量状态没有真正保存,随着购物车页面重新绘制,之前的状态就消失了

应用中的多个部分之间共享一个非短时的状态

举个例子:电商应用的购物车界面,我们点击结算,我们希望获取价格,就需要再结算界面的时候获取购物车界面的商品数量,商品价格等信息,这就是共享状态


这种时候我们往往就需要状态管理的库,如provider,redux,riverpod,getx

选用规则

需要说明的是,我们可以使用 State 和 setState() 管理你的应用中的所有状态。实际上Flutter团队在很多简单的示例程序(包括每次使用 flutter create 命令创建的初始应用)中正是这么做的

我们要遵循flutter官方提供的这个图就够了

flutter向 一文就够了 以声明式编程的角度理清到处都用的“状态state”是什么_第2张图片

当我们就 React 的 setState 和 Redux 的 Store 哪个好这个问题问 Redux 的作者 Dan Abramov 时, 他如此回答:

“经验原则是: 选择能够减少麻烦的方式”

总之,在任何 Flutter 应用中都存在两种概念类型的状态,短时状态经常被用于一个单独 widget 的本地状态,通常使用 State 和 setState() 来实现。其他的是你的应用应用状态,在任何一个 Flutter 应用中这两种状态都有自己的位置。如何划分这两种状态取决于你的偏好以及应用的复杂度。

 结束语

下一篇文章我将讨论provider的使用方式,基于provider库进行全局的应用状态管理

你可能感兴趣的:(flutter)