说道状态管理不得不说谷歌的亲自开发的两款状态管理
Widget
:第一个是provide
,第二个是provider
。这两个的区别就是一个出来的早,现在好像没整么更新了。第二个是2019才出来的目前的版本是
provider: ^3.2.0
。上一个停留在了provide: ^1.0.2
,基本上GG了。但是有时候项目中可能用到了provide
。所以现在我想说的是这两个的基本用法,或者说是两者使用的对比吧(控制多个界面的状态,项目中可能多个界面的状态管理更多。区别:provide 不会重建,provider会重建。
把以前项目中用的Provide改为Provider后遇到个问题,build重建。
解决问题:可以选择不监听 listen: false 或者改到 initstate。有更好的办法欢迎留言,谢谢。
一、创建
1、创建一个provide,还用上次例子的counter
import 'package:flutter/material.dart'; class Counter with ChangeNotifier{ int value = 0; increment(){ value++; notifyListeners(); //变化后通知听众 } }
2、创建一个provider
import 'package:flutter/material.dart'; class Counter with ChangeNotifier { int _count = 0; get count => _count; void increment() { _count++; notifyListeners(); //通知 } }
二、顶层依赖
1、provide
void main() { //顶层依赖 var counter = Counter(); var providers = Provider(); providers ..(Provider<Counter>.value(counter)); runApp(ProviderNode(child: MyApp(), providers: providers)); }
2、provider
void main() { runApp( MultiProvider( providers: [ ChangeNotifierProvider.value(value: Counter()), //ChangeNotifierProvider(builder: (_) => Counter()), ], child: MyApp(), ), ); }
三、使用
1、provide
Provide.value<Counter>(context).increment(); //掉用increment方法。。这里也可以传参数进去只需要在 Counter 里面的 increment 里面写两个接受参数的就好
2、provider
Provider.of<Counter>(context, listen: false).increment(); //这里也可以传参数
四、获取值
1、provide
return Provide<ZxxxDetailsProvide>( builder: (context,child,val){ var goodsInfo = Provide.value<ZxxxDetailsProvide>(context).goodsInfo.data; } );
2、provider
return Consumer<ZxxxListProvide>( builder: (context,model,child){ ... } );
重要提示:在使用 provider
的时候我们要注意了一定要设置listen的Bool值就是这样
await Provider.of<DetailsInfoProvide>(context, listen: false).getGoodsInfo(goodsId);