參考來源:http://www.jspang.com/posts/2019/03/01/flutter-shop.html#%E7%AC%AC24%E8%8A%82%EF%BC%9Aprovide%E7%8A%B6%E6%80%81%E7%AE%A1%E7%90%86%E5%9F%BA%E7%A1%80

詳細的講解:https://www.jianshu.com/p/25e581f55cfb

Flater-Provide狀態管理

项目的商品类别页面将大量的出现类和类中间的状态变化,这就需要状态管理。现在Flutter的状态管理方案很多,redux、bloc、state、Provide。

  • Scoped Model : 最早的状态管理方案,我刚学Flutter的时候就使用的这个,虽然还有公司在用,但是大部分已经选用其它方案了。

  • Redux:现在国内用的最多,因为咸鱼团队一直在用,还出了自己fish redux

  • bloc:个人觉的比Redux简单,而且好用,特别是一个页面里的状态管理,用起来很爽。

  • state:我们首页里已经简单接触,缺点是耦合太强,如果是大型应用,管理起来非常混乱。

  • Provide:是在Google的Github下的一个项目,刚出现不久,所以可以推测他是Google的亲儿子,用起来也是相当的爽。

所以个人觉的Flutter_provide是目前最好的状态管理方案,那我们就采用这种方案来制作项目。

视频链接地址:https://m.qlchat.com/topic/details?topicId=2000003957012933

flutter_Provide简介

Provide是Google官方推出的状态管理模式。官方地址为:https://github.com/google/flutter-provide

A simple framework for state management in Flutter

个人看来Provide被设计为ScopedModel的代替品,并且允许我们更加灵活地处理数据类型和数据。

使用Provide

这节课就简单用flutter_provide进行一个简单的小实例,例子是这样的,我们在一个页面上增加了Text和一个RaisedButton.并且故意使用了StatelessWidget作了两个类。也就是估计作了一个不可变的页面,并且用两个类隔离了。然后我们要点击按钮,增加数字数量,也就是把状态打通。

制作最基本的页面

快速写一个最基本的页面,并且全部使用了StatelessWidget进行。

  1. import 'package:flutter/material.dart';
  2.  
  3. class IndexPage extends StatelessWidget {
  4. @override
  5. Widget build(BuildContext context) {
  6. return Scaffold(
  7. body:Center(
  8. child: Column(
  9. children: <Widget>[
  10. Number(),
  11. MyButton()
  12. ],
  13. ),
  14. )
  15. );
  16. }
  17. }
  18.  
  19. //文本
  20. class Number extends StatelessWidget {
  21.  
  22. @override
  23. Widget build(BuildContext context) {
  24. return Container(
  25. margin: EdgeInsets.only(top:200),
  26. child:Text('0')
  27. );
  28. }
  29. }
  30.  
  31. //按鈕
  32. class MyButton extends StatelessWidget {
  33.  
  34. @override
  35. Widget build(BuildContext context) {
  36. return Container(
  37. child:RaisedButton(
  38. onPressed: (){},
  39. child: Text('递增'),
  40. )
  41. );
  42. }
  43. }

添加依赖

pubspec.yaml中添加Provide的依赖。请使用最新版本。

  1. dependencies:
  2. provide: ^1.0.2

创建Provide

这个类似于创建一个state,但是为了跟State区分,我们叫创建Provide。新建一个provide文件夹,然后再里边新建一个counter.dart 文件.代码如下:

  1. import 'package:flutter/material.dart';
  2.  
  3. class Counter with ChangeNotifier {
  4. int value =0 ;
  5.  
  6. increment(){
  7. value++;
  8. notifyListeners();
  9. }
  10. }

将状态放入顶层

先引入providecounter

  1. import 'package:provide/provide.dart';
  2. import './provide/counter.dart';

然后进行将providecounter引入程序顶层。

  1. void main(){
  2. var counter = Counter();
  3. var providers = Providers();
  4. providers
  5. //多個狀態的管理
  6. //..provide(Provider<Counter>.value(counter))
  7. ..provide(Provider<Counter>.value(counter));
  1. //runApp(MyApp());
    runApp(
    ProviderNode(
    child: MyApp(),
    providers: providers,
    ),
    );
  1. }

ProviderNode封装了InheritWidget,并且提供了 一个providers容器用于放置状态。

获取状态

使用Provide Widget的形式就可以获取状态,比如现在获取数字的状态,代码如下。

  1. class Number extends StatelessWidget {
  2. @override
  3. Widget build(BuildContext context) {
  4. return Container(
  5. margin: EdgeInsets.only(top:200),
  6. child: Provide<Counter>(
  7. builder: (context,child,counter){
  8. return Text(
  9. '${counter.value}',
  10. style: Theme.of(context).textTheme.display1,
  11. );
  12. },
  13. ),
  14. );
  15. }
  16. }

修改状态

直接编写按钮的单击事件,并调用provide里的方法,代码修改如下。

  1. //按鈕
  2. class MyButton extends StatelessWidget {
  3.  
  4. @override
  5. Widget build(BuildContext context) {
  6. return Container(
  7. child:RaisedButton(
  8. onPressed: (){
  9. //調用狀態管理增加的方法
  10. Provide.value<Counter>(context).increment();
  11. },
  12. child: Text('递增'),
  13. )
  14. );
  15. }
  16. }

ProviderNode封装了InheritWidget,并且提供了 一个providers容器用于放置状态。

获取状态

使用Provide Widget的形式就可以获取状态,比如现在获取数字的状态,代码如下。

  1. //文本
  2. class Number extends StatelessWidget {
  3. @override
  4. Widget build(BuildContext context) {
  5. return Container(
  6. margin: EdgeInsets.only(top:200),
  7. child: Provide<Counter>(
  8. builder: (context,child,counter){
  9. return Text(
  10. '${counter.value}',
  11. style: Theme.of(context).textTheme.display1,
  12. );
  13. },
  14. ),
  15. );
  16. }
  17. }

builder有三个参数

  • context,上下文
  • child,返回构建的小部件即可
  • provide,即我们创建的数据对象,名称随意

修改状态

直接编写按钮的单击事件,并调用provide里的方法,代码修改如下。

  1. //按鈕
  2. class MyButton extends StatelessWidget {
  3.  
  4. @override
  5. Widget build(BuildContext context) {
  6. return Container(
  7. child:RaisedButton(
  8. onPressed: (){
  9. //調用狀態管理增加的方法
  10. Provide.value<Counter>(context).increment();
  11. },
  12. child: Text('递增'),
  13. )
  14. );
  15. }
  16. }

其他頁面可以直接讀取狀態

  1. //Provide.value(context)的形式
  2. Provide.value<Counter>(context).getValue.toString(),

Flater-Provide狀態管理的更多相关文章

  1. 檢查RAC狀態

    1.使用srvctl工具檢查RAC當前配置和狀態 $ srvctl config database -h Displays the configuration for the database. Us ...

  2. Win10還原成最乾淨的狀態 不必重灌

    系統不穩定時我們想到的第一個選擇就是重灌,如果你的作業系統是win10將會有另外一個新選擇,就是透過程式進行還原,讓你的電腦回到剛安裝時的清爽. 工具資訊 [軟體名稱]微軟 Refresh Windo ...

  3. Win10還原成最乾淨的狀態

    系統不穩定時我們想到的第一個選擇就是重灌,如果你的作業系統是win10將會有另外一個新選擇,就是透過程式進行還原,讓你的電腦回到剛安裝時的清爽. 工具資訊 [軟體名稱]微軟 Refresh Windo ...

  4. ES 處於“initializing”狀態,此時主節點正在嘗試將分片分配到集群中的數據節點。 如果您看到分片仍處於初始化或未分配狀態太長時間,則可能是您的集群不穩定的警告信號。

    指標要點: Cluster status: 如果集群狀態為黃色,則至少有一個副本分片未分配或丟失. 搜索結果仍將完成,但如果更多的分片消失,您可能會丟失數據. 紅色的群集狀態表示至少有一個主分片丟失, ...

  5. SSIS 無法將保護的 XML 節點 "DTS:Password" 解密,錯誤為 0x8009000B "機碼用在特定狀態時無效

    发现之前部署的SSIS,执行失败,查看日志 來源: 描述: 無法將保護的 XML 節點 -- ::-- ::-- :: DataReader 來源 [] 描述: System.Exception: S ...

  6. [Gem] AASM 狀態機

    @(Ruby on Rails)[rails, gem] 1234 # AASM is a continuation of the acts-as-state-machine rails plugin ...

  7. HTTP狀態碼

    1xx消息 这一类型的状态码,代表请求已被接受,需要继续处理.这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束.由于HTTP/1.0协议中没有定义任何1xx状态码,所以除非在某些试 ...

  8. (转帖) 有限狀態機FSM coding style整理 (SOC) (Verilog)

    来源:http://www.codesoso.net/Record/101092_95120_21.html 来源:http://www.cnblogs.com/oomusou/archive/201 ...

  9. memcached+狀態模式+工廠方法使用

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

随机推荐

  1. NAACL 2019 字词表示学习分析

    NAACL 2019 表示学习分析 为要找出字.词.文档等实体表示学习相关的文章. word embedding 搜索关键词 word embedding Vector of Locally-Aggr ...

  2. pandas库简介和数据结构

    pandas简介 pandas是一个强大的Python数据分析的工具包.是基于Numpy来构件的. pandas提供快速.灵活和富有表现力的数据结构. 主要功能: 具备对其功能的数据结构DataFra ...

  3. 使用 Dom4j 对XML操作!!!

    转自:http://blog.csdn.net/redarmy_chen/article/details/12969219 dom4j是一个Java的XML API,类似于jdom,用来读写XML文件 ...

  4. Python基本语法_基本数据类型_序列类型详解

    目录 目录 序列 序列的标准操作符 切片操作符 一个例子 字符串的连接 序列的功能函数 enumerate 枚举出序列对象的元素 len 获取序列对象的长度 min 取出sequence中的最小值 m ...

  5. Java使用JDBC连接Hive

    最近一段时间,处理过一个问题,那就是hive jdbc的连接问题,其实也不是大问题,就是url写的不对,导致无法连接.问题在于HiveServer2增加了别的安全验证,导致正常的情况下,传递的参数无法 ...

  6. ARTS-2

    ARTS的初衷 Algorithm:主要是为了编程训练和学习.每周至少做一个 leetcode 的算法题(先从Easy开始,然后再Medium,最后才Hard).进行编程训练,如果不训练你看再多的算法 ...

  7. pgAdmin III 使用图解

    pgAdmin III简介 要打开一个到服务的连接,在树中选择所需的服务,并双击它,或使用“工具”菜单上的连接即可. 一.主窗体 在主窗口中,显示数据库的结构.您可以创建新的对象,删除和编辑现有的对象 ...

  8. 【MM系列】SAP 物料帐下修改物料的价格

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP 物料帐下修改物料的价格   ...

  9. Java课堂疑问解答与思考3

    一. 两对整数明明完全一样,为何一个输出true,一个输出false? 答: 整数在小于127时都可以用常量池,因此第一次比较的的地址是取自同一个地址的数字,而第二次比较的数是创建了两个不同地址的对象 ...

  10. finereport 带多参数查询

    1.sql语句 ${,""," and dt.货主地区='"+comboBox0+"'")} ${,""," ...