文档地址。

https://github.com/rrousselGit/provider/blob/master/resources/translations/zh-CN/README.md

以下代码地址

https://github.com/AYuWei/YuWeiFlutterApp/tree/2021-1-15_Provider

全局状态管理。

__

先来一个改变全局状态的主题

ThemeModel

  1. import 'package:flutter/material.dart';
  2. class ThemeModel with ChangeNotifier {
  3. ThemeData themeData;
  4. ThemeType currentType;
  5. ThemeModel(ThemeType type){
  6. currentType = type;
  7. type == ThemeType.dark ?
  8. themeData = ThemeData.dark() :
  9. themeData = ThemeData.light();
  10. }
  11. // 反转
  12. void reverse(){
  13. currentType == ThemeType.dark ?
  14. _upDate(ThemeType.light) :
  15. _upDate(ThemeType.dark);
  16. }
  17. void _upDate(ThemeType type){
  18. currentType = type; // 当前类型
  19. type == ThemeType.light ?
  20. themeData = ThemeData.light() :
  21. themeData = ThemeData.dark();
  22. notifyListeners(); // 更改状态
  23. }
  24. }
  25. enum ThemeType {
  26. light, // 白天模式
  27. dark, // 黑暗模式
  28. }

入口引入

  1. runApp(
  2. ChangeNotifierProvider<ThemeModel> (
  3. create: (_) {
  4. return ThemeModel(ThemeType.dark);
  5. },
  6. child: RootApp(),
  7. ) );

在MaterialApp中使用

  1. return MaterialApp(
  2. theme: Provider.of<ThemeModel>(context).themeData ,
  3. home:IndexInHeritedWidget() ,
  4. );

在某个页面中【修改状态/获取数据】

  1. FlatButton(
  2. onPressed: (){
  3. // 反转颜色。
  4. Provider.of<ThemeModel>(context, listen: false).reverse();
  5. },
  6. child: Consumer<ThemeModel>(
  7. builder: (context, type, child){
  8. String result = "切换成";
  9. if(type.currentType == ThemeType.dark ){
  10. result += "白天模式";
  11. } else {
  12. result += "黑夜模式";
  13. }
  14. return Text(result);
  15. },
  16. )
  17. // child:
  18. // Selector<ThemeModel, ThemeType>(
  19. // builder: (context, type, child){
  20. // String result = "切换成";
  21. // if(type == ThemeType.dark ){
  22. // result += "白天模式";
  23. // } else {
  24. // result += "黑夜模式";
  25. // }
  26. // return Text(result);
  27. // },
  28. // selector: (context, themeModel){
  29. // return themeModel.currentType;
  30. // },
  31. // )
  32. ),

__

当我们需要监听很多状态的时候(方法一:层级太多,方法二:同意层级管理)我们以后使用方法二。

添加状态

方法一:

image.png

方法二:

image.png

使用状态

image.png
Screenshot_1610703904.png

去另一个页面改变数据

Screenshot_1610703955.png
Screenshot_1610704080.png
Screenshot_1610704093.png