flutter中的状态管理Provider 简单使用
今天简单说一下flutter中的状态管理,我们这次使用provider;
Model,模型,这里面定义了我们准备全局使用的数据,或者各个方法; 例如 下面的DriverStrokeManageProvide就是一个model
class DriverStrokeManageProvide extends ChangeNotifier {
StrokeCurrentManageEntity _strokeCurrentManageEntity;
List<StrokeManageListEntity> _strokeManageListEntity;
//当前司机状态
StrokeCurrentManageEntity get strokeCurrentManageEntity => _strokeCurrentManageEntity;
//司机行程列表
List<StrokeManageListEntity> get strokeManageListEntity => _strokeManageListEntity;
void setCurrentManage(StrokeCurrentManageEntity data) {
_strokeCurrentManageEntity = data;
notifyListeners();
}
void setManageList(List<StrokeManageListEntity> data) {
_strokeManageListEntity = data;
notifyListeners();
}
}
void 方法1(){
notifyListeners();
}
void 方法2(){
notifyListeners();
}
一、Provider的三个好兄弟:
老大 -- MultiProvider
老二 -- Providers
老三 -- Provider.of<T>(context) / Widget Consumer
二、三兄弟的组合拳:
1、老大 MultiProvider 基本都在mainapp里面统一注册 例如 用户信息 ,司机操作信息,等继承changeNotifier的对象model
providers: [
ChangeNotifierProvider(create: (_) => Global.useStatusStatus),
ChangeNotifierProvider(create: (_) => StatusSelectProvide()),
ChangeNotifierProvider(create: (_) => DriverStrokeManageProvide()),
],
Widget build(BuildContext context) {
return MultiProvider(
providers: [],
child: MaterialApp(
title: 'Provider Demo',
initialRoute: '/',
),
);
}
2、老二 Providers登场:
其实也很好理解,既然老大可以将我们准备好的各个Model输送到各个节点,那前提是不是老大得知道都有哪些Model需要被送走呢,老二出现了,他就负责预先定义好,需要被共享的Model;
其中用处较多的是 ChangeNotifierProvider 和 ChangeNotifierProxyProvider 这两个类
二儿子: ChangeNotifierProvider 它会随着某些数据改变而被通知更新,也就是说,比如这个Model被用在多个page,那么当其中一处被改变时,他就应该告诉其他的地方,我的数据更改了 ,使用我的要更新weight了
ChangeNotifierProvider 更详细使用 https://www.codercto.com/a/79180.html
三儿子: ChangeNotifierProxyProvider,要协调Model与Model之间的更新,比如一个ModelA依赖另一个ModelB,ModelB更新,他就要让依赖它的ModelA也随之更新,
//todo 统一进行privider的创建使用
List<SingleChildWidget> provider = [
...independentServices,
// ...dependentServices,
];
/// 独立的model ChangeNotifierProvider
List<SingleChildWidget> independentServices = [
ChangeNotifierProvider(create: (_) => Global.useStatusStatus),
ChangeNotifierProvider(create: (_) => StatusSelectProvide()),
ChangeNotifierProvider(create: (_) => DriverStrokeManageProvide()),
];
/// 需要依赖的model ChangeNotifierProxyProvider
///
/// UserModel依赖globalFavouriteStateModel
//List<SingleChildWidget> dependentServices = [
// ChangeNotifierProxyProvider<GlobalFavouriteStateModel, UserModel>(
// create: null,
// update: (context, globalFavouriteStateModel, userModel) =>
// userModel ?? UserModel(globalFavouriteStateModel: globalFavouriteStateModel),
// )
//];
3、老三是消费者,也就是说,他就是负责从各个节点取出数据来供使用的;
为什么说他怪,因为他有两种形态,一种是需要绑定在widget中展示用的,另一种则不是,只是需要作为数据去使用;
变身一
var foo = Provider.of<T>(context);
T是你需要的Model,只需如此,你的foo就取出来了;
变身二
Consumer<T>(
builder: (context,foo, child) => Text('$foo.text')
)
widget展示,foo如上,也是从Model中取出的数据,随意使用;
本文地址:https://blog.csdn.net/u013297881/article/details/107832750