Flutter狀態管理之provide和provider的使用區別


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM