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中取出的数据,随意使用;

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值