flutter Provider状态管理

Posted InutsukaKiba

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flutter Provider状态管理相关的知识,希望对你有一定的参考价值。

flutter provider跨组件状态共享的简单使用

provider是对InheritedWidget进行封装的,官方介绍有简化资源分配,懒加载,创建新类时减少大量的模板代码,支持DevTools,提升类的可扩展性,整体监听架构时间复杂度以及指数增长,还可以调用InheritedWidget对于InheritedWidget自行搜索了解

先加依赖

provider: ^6.0.1

下面是一个可以依赖多个模型,并且可以刷新UI的列子

然后假装这你要共享的模型

class ProviderModels with ChangeNotifier 
  int name = 1;

  void changeName() 
    name++;
    notifyListeners();
  

provider有八种提供者,如果是使用provider的话他的模型是不需要继承ChangeNotifier ,因为他只会修改值,并不会修改UI,
然后创建共享数据

  @override
  Widget build(BuildContext context) 
  //依赖多个模型使用MultiProvider
    return MultiProvider(
        providers: [
          //这个就是无法刷新UI的提供者providerData不需要继承ChangeNotifier 
          Provider(create: (context) => providerData()),
          //这是我们要用到的可以刷新UI的
          ChangeNotifierProvider<ProviderModels>(
              create: (_) => ProviderModels()),
        ],
        child: MaterialApp(.....));
  

MultiProvider是依赖多个模型使用,如果只需要一个提供者(Provider或者ChangeNotifierProvider或者是其他)可以直接使用,下面用Provider举个栗子

列如:
 final name= 48;
 Provider<int>.value(
      value: name,
      child: ......,
    ),

接下来使用方式

Consumer<ProviderModels>(
        builder: (BuildContext context, value, Widget? child) 
        //value就是ProviderModels
          return Text(value.name.toString());
        ,
      ),

也可以直接用

child: Text(Provider.of<ProviderModels>(context).name.toString())

Consumer是封装好的,使用起来更加方便,看看下面源码大家就明白了

  /// @template provider.consumer.constructor
  /// Consumes a [Provider<T>]
  /// @endtemplate
  Consumer(
    Key? key,
    required this.builder,
    Widget? child,
  ) : super(key: key, child: child);

  /// @template provider.consumer.builder
  /// Build a widget tree based on the value from a [Provider<T>].
  ///
  /// Must not be `null`.
  /// @endtemplate
  final Widget Function(
    BuildContext context,
    T value,
    Widget? child,
  ) builder;

  @override
  Widget buildWithChild(BuildContext context, Widget? child) 
    return builder(
      context,
      Provider.of<T>(context),
      child,
    );
  

最后就是修改数据的时候

 final models = Provider.of<ProviderModels>(context);
 .....
  onTap: (index) 
            models.changeName();
           ,

了解到他的原因是我在项目中使用EventBus的,但是EventBus是通过观察者模式来实现跨组件状态共享的,订阅者必须需显式注册状态改变回调,也得在组件销毁的时候手动去解绑啥的,还需要定义很多事件,就很麻烦,provider的话他可以使UI和咱们的页面逻辑分离,个人感觉比EventBus更好用
最后谢谢jimi文章的帮助

以上是关于flutter Provider状态管理的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 响应式状态管理框架GetX

Flutter——sdk:状态管理provider

Flutter——sdk:状态管理provider

Flutter——sdk:状态管理provider

Flutter Provider状态管理

flutter中的状态管理Provider