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

2022-07-31,,,,

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

《flutter中的状态管理Provider 简单使用.doc》

下载本文的Word格式文档,以方便收藏与打印。