Flutter | 状态管理特别篇 ——

点击左侧的导航右侧的导航发生变化,这属于两个widget。这两个widget之间进行通讯。用setstate的形式,耦合性太强

Flutter移动电商实战 --(24)Provide状态管理基础_sed

状态管理有这么几种方案

Flutter移动电商实战 --(24)Provide状态管理基础_sed_02

这里我们用Provide,谷歌自己推出的

​https://github.com/google/flutter-provide​

开始写测试例子

我们在购物车的页面

这是我们原来购物车的页面

Flutter移动电商实战 --(24)Provide状态管理基础_sed_03

在里面写我们的组件,放个center在中间,里面用column进行上下布局。放两个widget

Flutter移动电商实战 --(24)Provide状态管理基础_flutter_04

下面来创建我们的widget

创建numberwidget

stless快速生成,中间就放一个Text

Flutter移动电商实战 --(24)Provide状态管理基础_flutter_05

Flutter移动电商实战 --(24)Provide状态管理基础_数据库_06

快速生成button的widget

Flutter移动电商实战 --(24)Provide状态管理基础_flutter 项目实战_07

故意用了三个widget形成了我们的的页面。展示效果:

Flutter移动电商实战 --(24)Provide状态管理基础_flutter 项目实战_08

添加状态的引用

pubspec.yaml文件内添加引用

Flutter移动电商实战 --(24)Provide状态管理基础_flutter_09

Flutter移动电商实战 --(24)Provide状态管理基础_flutter 项目实战_10

有了provide后,做数据库仓库

lib文件夹下创建provide的文件夹,然后创建counter.dart

Flutter移动电商实战 --(24)Provide状态管理基础_flutter_11

Counter类必须混入with ChangeNotifier

Flutter移动电商实战 --(24)Provide状态管理基础_数据库_12

定义增加的方法:increment

然后把value的值++后,调用notifyListeners()方法通知听众,vlaue值发生了改变,局部刷新我们的widget

Flutter移动电商实战 --(24)Provide状态管理基础_flutter_13

main.dart内

Flutter移动电商实战 --(24)Provide状态管理基础_数据库_14

runApp(MyApp());也要进行修改

Flutter移动电商实战 --(24)Provide状态管理基础_sed_15

获取值

首先在购物车页面添加引用

Flutter移动电商实战 --(24)Provide状态管理基础_flutter 项目实战_16



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


Flutter移动电商实战 --(24)Provide状态管理基础_flutter 项目实战_17

我们如何监听它 需要在外层包裹一个provider组件。

Provide<Counter>里面有构造器builder需要传三个参数,第一个是上下文,第二个是child,第三个就是我们的counter对象

Flutter移动电商实战 --(24)Provide状态管理基础_ide_18

这样就是已经获取我们的状态的值了。

Flutter移动电商实战 --(24)Provide状态管理基础_ide_19

修改状态值

调用我们在Counter里面定义的增加的方法

Flutter移动电商实战 --(24)Provide状态管理基础_flutter_20

Flutter移动电商实战 --(24)Provide状态管理基础_sed_21

 在会员中心页面进行测试

member_page.dart。如果在这个页面获取Counter的值,我们就是真正的实现了全局页面的状态管理

首先添加引用,外层用Provide包裹住,然后调用builder方法

Flutter移动电商实战 --(24)Provide状态管理基础_sed_22

我们在购物车页面把数字加到13.

Flutter移动电商实战 --(24)Provide状态管理基础_flutter_23

在到会员中心查看我们的counter的值,也是13.两个页面的值是相同的。这样就实现了全局的值状态管理

Flutter移动电商实战 --(24)Provide状态管理基础_数据库_24

最终代码:

counter.dart



import 'package:flutter/material.dart';

class Counter with ChangeNotifier{
int value=0;

increment(){
value++;
notifyListeners();
}
}


cart_page.dart



import 'package:flutter/material.dart';
import 'package:provide/provide.dart';
import '../provide/counter.dart';

class CartPage 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.0),
child: Provide<Counter>(
builder: (context,child,counter){
return Text(
'${counter.value}',
style:Theme.of(context).textTheme.display1
);
},
),
);
}
}
class MyButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
child: RaisedButton(
onPressed: (){
Provide.value<Counter>(context).increment();
},
child: Text('递增'),
),
);
}
}


member_page.dart



import 'package:flutter/material.dart';
import 'package:provide/provide.dart';
import '../provide/counter.dart';

class MemberPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child:Provide<Counter>(
builder: (context,child,counter){
return Text(
'${counter.value}',
style: Theme.of(context).textTheme.display1,
);
},
),
),
);
}
}


.