欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

flutter中的状态管理Provider 简单使用

程序员文章站 2022-07-08 08:22:24
今天简单说一下flutter中的状态管理,我们这次使用provider;  Model,模型,这里面定义了我们准备全局使用的数据,或者各个方法; 例如 下面的DriverStrokeManageProvide就是一个modelclass DriverStrokeManageProvide extends ChangeNotifier { StrokeCurrentManageEntity _strokeCurrentManageEntity; List

今天简单说一下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