zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    洛谷 P1991 无线通讯网/一本通OJ 1487【例 2】北极通讯网络
    [NOIP2016TG] 洛谷 P1850 换教室
    洛谷 P1169 [ZJOI2007]棋盘制作
    C#中数组、ArrayList和List三者的区别
    【转载】C#读写注册表
    UninstallTool(Windows软件卸载工具)--快捷、方便卸载电脑中的软件
    C#启动一个外部程序-CreateProcess
    C# 调用外部程序Process类
    学习C#,每天一话
    C#中字符串处理(随时更新)
  • 原文地址:https://www.cnblogs.com/joe235/p/11971945.html
Copyright © 2011-2022 走看看