Flater-Provide狀態管理
詳細的講解: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进行。
import 'package:flutter/material.dart';
class IndexPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body:Center(
child: Column(
children: <Widget>[
Number(),
MyButton()
],
),
)
);
}
}
//文本
class Number extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
margin: EdgeInsets.only(top:200),
child:Text('0')
);
}
}
//按鈕
class MyButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
child:RaisedButton(
onPressed: (){},
child: Text('递增'),
)
);
}
}
添加依赖
在pubspec.yaml中添加Provide的依赖。请使用最新版本。
dependencies:
provide: ^1.0.2
创建Provide
这个类似于创建一个state,但是为了跟State区分,我们叫创建Provide。新建一个provide文件夹,然后再里边新建一个counter.dart 文件.代码如下:
import 'package:flutter/material.dart';
class Counter with ChangeNotifier {
int value =0 ;
increment(){
value++;
notifyListeners();
}
}
将状态放入顶层
先引入provide和counter:
import 'package:provide/provide.dart';
import './provide/counter.dart';
然后进行将provide和counter引入程序顶层。
void main(){
var counter = Counter();
var providers = Providers();
providers
//多個狀態的管理
//..provide(Provider<Counter>.value(counter))
..provide(Provider<Counter>.value(counter));
//runApp(MyApp());
runApp(
ProviderNode(
child: MyApp(),
providers: providers,
),
);
}
ProviderNode封装了InheritWidget,并且提供了 一个providers容器用于放置状态。
获取状态
使用Provide Widget的形式就可以获取状态,比如现在获取数字的状态,代码如下。
class Number extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
margin: EdgeInsets.only(top:200),
child: Provide<Counter>(
builder: (context,child,counter){
return Text(
'${counter.value}',
style: Theme.of(context).textTheme.display1,
);
},
),
);
}
}
修改状态
直接编写按钮的单击事件,并调用provide里的方法,代码修改如下。
//按鈕
class MyButton extends StatelessWidget { @override
Widget build(BuildContext context) {
return Container(
child:RaisedButton(
onPressed: (){
//調用狀態管理增加的方法
Provide.value<Counter>(context).increment();
},
child: Text('递增'),
)
);
}
}
ProviderNode封装了InheritWidget,并且提供了 一个providers容器用于放置状态。
获取状态
使用Provide Widget的形式就可以获取状态,比如现在获取数字的状态,代码如下。
//文本
class Number extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
margin: EdgeInsets.only(top:200),
child: Provide<Counter>(
builder: (context,child,counter){
return Text(
'${counter.value}',
style: Theme.of(context).textTheme.display1,
);
},
),
);
}
}
builder有三个参数
- context,上下文
- child,返回构建的小部件即可
- provide,即我们创建的数据对象,名称随意
修改状态
直接编写按钮的单击事件,并调用provide里的方法,代码修改如下。
//按鈕
class MyButton extends StatelessWidget { @override
Widget build(BuildContext context) {
return Container(
child:RaisedButton(
onPressed: (){
//調用狀態管理增加的方法
Provide.value<Counter>(context).increment();
},
child: Text('递增'),
)
);
}
}
其他頁面可以直接讀取狀態
//Provide.value(context)的形式
Provide.value<Counter>(context).getValue.toString(),
Flater-Provide狀態管理的更多相关文章
- 檢查RAC狀態
1.使用srvctl工具檢查RAC當前配置和狀態 $ srvctl config database -h Displays the configuration for the database. Us ...
- Win10還原成最乾淨的狀態 不必重灌
系統不穩定時我們想到的第一個選擇就是重灌,如果你的作業系統是win10將會有另外一個新選擇,就是透過程式進行還原,讓你的電腦回到剛安裝時的清爽. 工具資訊 [軟體名稱]微軟 Refresh Windo ...
- Win10還原成最乾淨的狀態
系統不穩定時我們想到的第一個選擇就是重灌,如果你的作業系統是win10將會有另外一個新選擇,就是透過程式進行還原,讓你的電腦回到剛安裝時的清爽. 工具資訊 [軟體名稱]微軟 Refresh Windo ...
- ES 處於“initializing”狀態,此時主節點正在嘗試將分片分配到集群中的數據節點。 如果您看到分片仍處於初始化或未分配狀態太長時間,則可能是您的集群不穩定的警告信號。
指標要點: Cluster status: 如果集群狀態為黃色,則至少有一個副本分片未分配或丟失. 搜索結果仍將完成,但如果更多的分片消失,您可能會丟失數據. 紅色的群集狀態表示至少有一個主分片丟失, ...
- SSIS 無法將保護的 XML 節點 "DTS:Password" 解密,錯誤為 0x8009000B "機碼用在特定狀態時無效
发现之前部署的SSIS,执行失败,查看日志 來源: 描述: 無法將保護的 XML 節點 -- ::-- ::-- :: DataReader 來源 [] 描述: System.Exception: S ...
- [Gem] AASM 狀態機
@(Ruby on Rails)[rails, gem] 1234 # AASM is a continuation of the acts-as-state-machine rails plugin ...
- HTTP狀態碼
1xx消息 这一类型的状态码,代表请求已被接受,需要继续处理.这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束.由于HTTP/1.0协议中没有定义任何1xx状态码,所以除非在某些试 ...
- (转帖) 有限狀態機FSM coding style整理 (SOC) (Verilog)
来源:http://www.codesoso.net/Record/101092_95120_21.html 来源:http://www.cnblogs.com/oomusou/archive/201 ...
- memcached+狀態模式+工廠方法使用
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
随机推荐
- 数据结构和算法(Java版)快速学习(交换、选择、插入排序)
基本排序算法:交换.选择.插入排序 常用的交换排序又称之为:冒泡排序 一般河水中的冒泡,水底刚冒出来的时候是比较小的,随着慢慢向水面浮起会逐渐增大,冒泡排序由此物理规律得来. 冒泡算法的运作规律如下: ...
- 修改web项目发布路径
Eclipse中用Tomcat发布的Web项目,更改其部署路径 我的Eclipse的工作目录是D:/workspace先配置Tomcat 选择你的tomcat版本 点击next 这里先不要把项目添加进 ...
- Flask基础以及Response三剑客
Flask的特点: 优点:小而精.三方组件全 缺点: 性能相对较差 因为依赖三方组件所以在更新的时候难免不同步 基础模板 from flask import Flask app = Flas ...
- WPF WebBrowser 加载 html ,出现安全警告, 运行 脚本和 activeX 控件,
对于你的问题,只需要在你的HTML首行添加如下代码即可隐藏安全提示条: <!-- saved from url=(0014)about:internet --> 还有一个可选方案是使用Wi ...
- promise不会被return触发, 一个promise对象中不会被Promise.reject触发
1. let a = new Promise((resolve,reject)=>{ return 23 }) a; // promise <pending> 2. let a = ...
- 【ABAP系列】SAP ABAP 开发中的SMARTFORMS 参数
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 开发中的SMA ...
- 配置idea中类头注释中的 ${user} 自动获取电脑的名字,怎么去修改名字
在idea安装路径下找到 idea\IntelliJ IDEA 2018.3.2\bin下面有一个文件叫:idea64.exe.vmoptions 编辑此文件就能修改主时钟自动获取的名称: 例如:添加 ...
- 9.shodan搜索引擎----Metasploit Web GUI----取证工具箱----sAINT间谍软件
shodan搜索引擎 物联网搜索引擎 访问路由器,服务器,网络摄像头,安装CLI banner抓取,端口扫描 www.shodan.io 需要注册账户,支持google账户 搜索 webcams 网络 ...
- 通过Spark Streaming处理交易数据
Apache Spark 是加州大学伯克利分校的 AMPLabs 开发的开源分布式轻量级通用计算框架. 由于 Spark 基于内存设计,使得它拥有比 Hadoop 更高的性能(极端情况下可以达到 10 ...
- Java数据结构之算法时间度
1.度量一个程序(算法)执行时间的两种方法 1)事后统计的方法 这种方法可行, 但是有两个问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该程序:二是所得时间的统计量依赖于计算机的硬件.软件 ...