Flutter 状态管理之 ChangeNotifierProvider(Provider)

栏目: IOS · Android · 发布时间: 6年前

内容简介:Provider 是 Google I/O 2019 大会上宣布的现在官方推荐的状态管理方式,而 ChangeNotifierProvider 可以说是 Provider 的一种。Provider GitHub 地址:再贴一个油管上的视频:

Provider 是 Google I/O 2019 大会上宣布的现在官方推荐的状态管理方式,而 ChangeNotifierProvider 可以说是 Provider 的一种。

Provider GitHub 地址: github.com/rrousselGit…

再贴一个油管上的视频: www.youtube.com/watch?v=xcS…

OK,那废话不多说。下面具体看看如何使用 ChangeNotifierProvider 做状态管理。

通过一个 demo 来展示 ChangeNotifierProvider 的使用。该 demo 实现的功能很简单,计数 + 切换主题。仅有两个页面,两个页面共享相同的数据。

效果图:

Flutter 状态管理之 ChangeNotifierProvider(Provider)

我已经将这个小 demo 上传至 GitHub: github.com/MzoneCL/flu…

第一步: 添加依赖

在 pubspec.yaml 文件中添加依赖。

Flutter 状态管理之 ChangeNotifierProvider(Provider)

provider 包 pub 地址:pub.dev/packages/pr…

第二步:创建共享数据类

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

class DataInfo with ChangeNotifier {
  int _count = 0;
  ThemeData _themeData = ThemeData.light();

  get count => _count;
  get themeData => _themeData;

  addCount() {
    _count++;
    notifyListeners();
  }
  subCount() {
    _count--;
    notifyListeners();
  }
  changeTheme() {
    if (_themeData == ThemeData.light()) {
      _themeData = ThemeData.dark();
    } else {
      _themeData = ThemeData.light();
    }
    notifyListeners();
  }
}
复制代码

数据类需要 with ChangeNotifier 以使用 notifyListeners() 函数通知监听者以更新界面。

第三步:获取数据

Provider 获取数据状态有两种方式:

  1. 使用 Provider.of(context) 获取 DataInfo
  2. 使用 Consumer

不过这两种方式都需要在顶层套上ChangeNotifierProvider():

Flutter 状态管理之 ChangeNotifierProvider(Provider)

1. 使用 Provider.of(context) 获取 DataInfo

例如,指定主题部分的代码如下:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    var dataInfo = Provider.of<DataInfo>(context);
    return MaterialApp(
      home: MyHomePage(),
      theme: dataInfo.themeData,
    );
  }
}
复制代码

通过Provider.of<DataInfo>(context) 获取 DataInfo 实例,需要在 of 函数后指明具体的数据类。然后就可以直接通过 getter 访问到 themeData 了。

2.使用 Consumer

同样,以指定主题部分代码为例:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Consumer<DataInfo>(
      builder: (context, dataInfo, _) => MaterialApp(
            home: MyHomePage(),
            theme: dataInfo.themeData,
          ),
    );
  }
}
复制代码

直接用 Consumer 包住需要使用共享数据的 Widget,同样的,Consumer 也要指明类型。

OK,以上就是 ChangeNotifierProvider 的基本使用了。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

编程卓越之道

编程卓越之道

Hyde R / 韩东海 / 电子工业出版社 / 2006-4-1 / 49.80

各位程序员一定希望自己编写的代码是能让老板赞赏、满意的代码;是能让客户乐意掏钱购买的代码;是能让使用者顺利使用的代码;是能让同行欣赏赞誉的代码;是能让自己引以为豪的卓越代码。本书作者为希望能编写出卓越代码的人提供了自己积累的关于卓越编程的真知灼见。它弥补了计算机科学和工程课程中被忽略的一个部分——底层细节,而这正是构建卓越代码的基石。具体内容包括:计算机数据表示法,二进制数学运算与位运算,内存组织......一起来看看 《编程卓越之道》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

SHA 加密
SHA 加密

SHA 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试