状态:即数据;全局状态:即很多页面或组件要共用的数据。

Flutter官方将状态分为:短时 (ephemeral) 状态应用 (app) 状态。所谓短时 (ephemeral) 状态即widget(组件)自己使用的数据;应用状态即本文所说的全局状态。

无论学习任何框架(vuex、redux)中的状态管理,其的核心还是在于如何存储数据以及如何获取到存储的数据,Provider是Flutter官方推荐的全局状态管理库。

接下来我们通过Provider官方示例来说明如何在应用中使用Provider管理全局数据。

一、全局状态管理类

全局混入的ChangeNotifierChangeNotifier 是 Flutter SDK 中的一个简单的类。用于向监听器发送通知。换言之,如果被定义为 ChangeNotifier,你可以订阅它的状态变化。

对于特别简单的程序,可以通过一个 ChangeNotifier 来满足全部需求。在相对复杂的应用中,由于会有多个模型,所以可能会有多个 ChangeNotifier

全局混入的DiagnosticableTreeMixin,可以帮助在devtools中进行更好地调试。

import 'package:flutter/foundation.dart';/// Mix-in [DiagnosticableTreeMixin] to have access to [debugFillProperties] for thdevtool
// ignore: prefer_mixin
class Counter with ChangeNotifier, DiagnosticableTreeMixin {// 定义数据int _count = 0;// 向外暴露_count的值int get count => _count;// 修改数据void increment() {_count++;notifyListeners(); // 更新UI视图}/// 为了方便调试devtools/// Makes `Counter` readable inside the devtools by listing all of its properties@overridevoid debugFillProperties(DiagnosticPropertiesBuilder properties) {super.debugFillProperties(properties);properties.add(IntProperty('count', count));}
}

唯一一行和 ChangeNotifier 相关的代码就是调用 notifyListeners()。当数据发生改变并且需要更新 UI 的时候可以调用该方法。而剩下的代码就是 Counter 和它本身的业务逻辑。

二、全局注入

ChangeNotifierProvider widget 可以向其子孙节点暴露一个 ChangeNotifier 实例。

/// This is a reimplementation of the default Flutter application using provider + [ChangeNotifier].
void main() {runApp(ChangeNotifierProvider(create: (context) => Counter(),child: const MyApp(),),);
}
class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);@overrideWidget build(BuildContext context) {return const MaterialApp(home: MyHomePage(),);}
}

如果想提供多个状态,需要使用 MultiProvider

/// This is a reimplementation of the default Flutter application using provider + [ChangeNotifier].
void main() {runApp(/// Providers are above [MyApp] instead of inside it, so that tests/// can use [MyApp] while mocking the providersMultiProvider(providers: [ChangeNotifierProvider(create: (_) => Counter()),],child: const MyApp(),),);
}
class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);@overrideWidget build(BuildContext context) {return const MaterialApp(home: MyHomePage(),);}
}

三、使用全局状态

class MyHomePage extends StatelessWidget {const MyHomePage({Key? key}) : super(key: key);@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('Example'),),body: Center(child: Column(mainAxisSize: MainAxisSize.min,mainAxisAlignment: MainAxisAlignment.center,children: const <Widget>[Text('You have pushed the button this many times:'),/// Extracted as a separate widget for performance optimization./// As a separate widget, it will rebuild independently from [MyHomePage].////// This is totally optional (and rarely needed)./// Similarly, we could also use [Consumer] or [Selector].Count(),],),),floatingActionButton: FloatingActionButton(key: const Key('increment_floatingActionButton'),/// Calls `context.read` instead of `context.watch` so that it does not rebuild/// when [Counter] changes.onPressed: () => context.read<Counter>().increment(),tooltip: 'Increment',child: const Icon(Icons.add),),);}
}class Count extends StatelessWidget {const Count({Key? key}) : super(key: key);@overrideWidget build(BuildContext context) {return Text(/// Calls `context.watch` to make [Count] rebuild when [Counter] changes.'${context.watch<Counter>().count}',key: const Key('counterState'),style: Theme.of(context).textTheme.headline4);}
}

Provider官方相关文档内容:

简单的应用状态管理 | Flutter 中文文档 | Flutter 中文开发者网站

provider | Flutter Package

往期内容:

一、【Flutter开发环境搭建】Java SDK安装

二、【Flutter开发环境搭建】Android SDK、Dart SDK及Flutter SDK安装_

三、Flutter Navigator路由传参

flutter全局状态管理Provider相关推荐

  1. Flutter - flutter_bloc状态管理

    继上一篇写了Flutter - GetX状态管理,会发现其实Flutter的状态管理的框架还是比较多的,用的比较多的有flutter_bloc.MobX.GetX等,今天我就来谈一谈我学习Flutte ...

  2. react全局状态管理_rxv: 在React中用Vue3的reactivity包实现状态管理。

    前言 React的状态管理是一个缤纷繁杂的大世界,光我知道的就不下数十种,其中有最出名immutable阵营的redux,有mutable阵营的mobx,react-easy-state,在hooks ...

  3. react获取全局_使用react hooks实现的简单全局状态管理

    注意,此代码存储库已被弃用,不会再更新维护了. Note that this code repository has been deprecated and will not be updated a ...

  4. React 全局状态管理的 3 种底层机制

    现代前端框架都是基于组件的方式来开发页面.按照逻辑关系把页面划分为不同的组件,分别开发不同的组件,然后把它们一层层组装起来,把根组件传入 ReactDOM.render 或者 vue 的 $mount ...

  5. Flutter主流状态管理框架provider、bloc、redux对比

    为什么需要状态管理 provider bloc redux 对比 总结 为什么需要状态管理 在了解和进行Flutter状态管理框架对比之前呢,我们先来问自己一个问题:为什么需要状态管理? 如果我们的应 ...

  6. 小程序全局状态管理,在页面中获取globalData和使用globalSetData

    GitHub: https://github.com/WozHuang/mp-extend 主要目标 微信小程序官方没有提供类似vuex.redux全局状态管理的解决方案,但是在一个完整的项目中各组件 ...

  7. 状态管理 - 全局状态管理工具

    文章目录 一.单向数据流 1. 理念示意图 2. 简述 二.什么是全局状态管理模式 三.重点概念 3.1. 什么是全局状态管理模式? 3.2.全局状态管理工具? 3.3. 什么是 vuex 四.在项目 ...

  8. 微信小程序----全局状态管理 (便于全局埋点等操作)

    说明 由于我是一个有着一颗玻璃心的博主,导致在2018年后博客很少更新.原因是由于我的分享并没有解决到部分人的问题,而导致被骂了.当时这颗玻璃心就碎了,所以这两年以来很是消极,博客很少更新.这里给那些 ...

  9. 微信小程序:全局状态管理mobx-miniprogram、mobx-miniprogram-bindings

    安装 npm install --save mobx-miniprogram mobx-miniprogram-bindings 定义 store.js /*** 全局状态管理*/ import { ...

  10. 微信小程序API的Promise化及全局状态管理MobX

    文章目录 API的Promise化 创建promise化的对象 全局状态管理 创建 页面中绑定 页面中使用 组件中绑定 组件中使用 API的Promise化 默认情况下小程序官方提供的API都是基于回 ...

最新文章

  1. linux文件自动删除,自动删除文件脚本(Linux shell脚本)
  2. Oracle 并行原理与示例总结
  3. 看完这些细分领域别说小程序代理创业没有机会
  4. 【机器学习算法专题(蓄力计划)】一、机器学习简史和常用算法的梳理
  5. mysql创建数据库时候同时创建表空间_mysql::创建多个表空间添加记录数据会添加到哪个表空间中?...
  6. 如何在云上使用confd+ACM管理敏感数据
  7. 零基础入门深度学习(7) - 递归神经网络
  8. 国风这么火,少不了古风建筑PNG格式
  9. mysql 重要维护工具 图解
  10. ios 格式化html字符串,ios – 粘贴格式化文本,不是图像或HTML
  11. 《Java技术》第四次作业
  12. 搭建eova开发环境
  13. dict后缀_词根词缀法记单词之dict
  14. javascript 实现自动定时刷新网页脚本
  15. 2021年第四季度全球消费者信心总体持平,印度仍为全球最高,中国大幅增长,日本仍远低于全球平均水平 | 美通社头条...
  16. Win7中双击bat文件变成打开文本编辑器后如何恢复
  17. 修改传奇私服服务器,传奇SF 肿么修改服务器时间
  18. 深入浅出Java Object Layout (JOL)
  19. ctf从零开始学 0x1:Windows下的二进制安全学习路线
  20. chatgpt赋能Python-python_hanning

热门文章

  1. UI 移动端设计尺寸
  2. YARN-client提交任务处理过程
  3. 【优化】1389- 万字长文:分享前端性能优化知识体系
  4. 【数据库CS751】数据库各种连接的理解(包括自然连接,内连接,外连接)
  5. DDR功能点 ODT ZQ校准
  6. html怎么使两张照片重叠,怎样把两张图片叠加在一起?
  7. 公民委托诉讼代理人的注意事项
  8. mac 更新系统时间
  9. WordPress教程:如何给网站添加导航?
  10. 大数据发展趋势十个大方向