說道狀態管理不得不說谷歌的親自開發的兩款狀態管理
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);
