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);

 

posted on 2019-12-02 17:19  JoeYoung  阅读(2007)  评论(0编辑  收藏  举报