什么是状态管理?
状态管理的目的就是为了让界面与业务分离。界面根据状态来显示,有操作时发出Action或者Event,而不处理实际 的业务,业务交给上层处理。bloc在界面中有操作发生时使用dispatch发出Event事件,fish-redux也是类似使用dispatch,只不过发出的叫Action动作而已。当dispatch发出事件时mapEventToState即可收到事件,此时将event根据业务转换为状态,状态会传递回给界面进行显示。bloc模块其实就是类似mvvm中的ViewModel,负责所有业务的处理。
换句话说,在flutter中,Statelesswidget都是没有状态的,没有提供刷新方法,但是如果全用statefulwidget的话又感觉很烦,每次刷新都要先判断一下是否更改过然后再调用一次setstate()方法,有时候想刷新一小块数据,这个时候就要用到状态管理来改变这些数据。
接下来哥哥带你一步一步走:
第一步:状态管理,你要管理的是什么,要做什么操作?
回答:我要我操作的数据++,实现一个计数器。
第二步,你要改变哪里的数据,你要在哪里操作?
回答:我想在全局的任何地方都可以改变那个数据,那么我最好把状态管理的providers放到应用顶层。
这里我要讲一下Google出品的两款Provider和Provide的区别,注意,他们只差一个r。
provider是最近才出现的比较新的,目前版本provider: ^3.0.0+1。而provide停留在provide: ^1.0.2。
使用Provide的话顶层处理要如上图……
没错,如果使用provider就不用这样了,而是如下:
Provide在具体方法中的使用:
Provide.value(context).increment(调用一下里面的方法。这里也可以传参数进去只需要在Counter里面的increment里面写两个接受参数的就好);
Provider这样写:
Provider.of(context,listen:false).increment(这里也可以传参数);
再来个实际的例子:
但是有时候我们需要的是一个data之类的,比较多的值。那我们可以这样做:
provide中:
provider中:
重要提示:在使用 provider的时候我们要注意了一定要设置listen的Bool值就是这样.
awaitProvider.of(context,listen:false).getGoodsInfo(goodsId);
附上Github地址:https://github.com/ryanranya/flutter_BXSH
第三步:建造Provide,调用Provide
看了那么多状态管理的,个人感觉Provider还是属于简单易用的,并且是google推荐的。官方推荐最致命!