当前位置: 首页 > backend >正文

Flutter中 Provider 的基础用法超详细讲解(二)之ChangeNotifierProvider

目录

前言

一、什么是ChangeNotifierProvider?

 二、ChangeNotifier的简单用法

1.定义状态类

2.使用ChangeNotifierProvider提供状态

3.获取状态并监听更新

1.Consumer

2.通过API方式获取

1.Provider.of (context)

2.context.watch ()

3.context.read ()

4.各种获取状态的方法的区别

三、ChangeNotifierProvider高级用法

1.多Provider组合使用

2.使用context.read、watch、select

1.read用于点击事件

2.select精细监听

3.局部重建优化

4.状态共享跨页面

5.手动获取最新状态


前言

        上篇文章中,我们大致了解下Provider的优点和缺点,这篇博客主要介绍Provider中的四大核心Provider中的ChangeNotifierProvider。

一、什么是ChangeNotifierProvider?

        ChangeNotifierProvider 是 Provider 包中用于提供 ChangeNotifier 类型对象给子 widget 树的组件。

        它的核心功能是:将状态对象注入到widget树中,供后续获取与监听更新。

        它的两个职责:

        持有一个 ChangeNotifier 状态对象

        自动管理它的生命周期(创建、释放)

 二、ChangeNotifier的简单用法

1.定义状态类

        我们首先定义我们的数据模型,这个数据模型继承自ChangeNotifier。

class Counter with ChangeNotifier {int _count = 0;int get count => _count;void increment() {_count++;notifyListeners(); // 通知 UI 更新}
}

2.使用ChangeNotifierProvider提供状态

void main() {runApp(ChangeNotifierProvider(create: (context) => Counter(),child: const MyApp(),),);
}

3.获取状态并监听更新

        ChangeNotifierProvider有两种方式获取状态分别是Consumer和API方式获取状态。

1.Consumer

class MyHomePage extends StatelessWidget {@overrideWidget build(BuildContext context) {return Consumer<Counter>(builder: (context, counter, _) => Column(children: [Text('Count: ${counter.count}'),ElevatedButton(onPressed: counter.increment,child: Text('Increment'),),],),);}
}

2.通过API方式获取

        除了上面的Consumer的方式获取Widget的状态之外,还可以通过下面的API实时获取Widget的状态。

1.Provider.of<T>(context)

        我们可以通过Provider.of<T>(context)获取Widget的状态。

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'consumer.dart';class ChangeNotifierProviderDemoPage extends StatelessWidget {final String title;const ChangeNotifierProviderDemoPage({super.key, required this.title});@overrideWid
http://www.xdnf.cn/news/16438.html

相关文章:

  • ES6模块详解:核心语法与最佳实践
  • c++加载qml文件
  • 小架构step系列27:Hibernate提供的validator
  • Oracle EBS 库存期间关闭状态“已关闭未汇总”处理
  • [ The Missing Semester of Your CS Education ] 学习笔记 shell篇
  • net8.0一键创建支持(Kafka)
  • Redis6.0+安装教程(Linux)
  • CPA青少年编程能力等级测评试卷及答案 Python编程(三级)
  • 分表分库与分区表
  • 【第六节】方法与事件处理器
  • docker-desktop引擎启动失败报wsl --update
  • Day4.AndroidAudio初始化
  • 数独求解器与生成器(回溯算法实现)
  • 【ESP32】无法找到: “${env:IDF_PATH}/components/“的路径报错问题以及CMAKE构建不成功问题
  • JVM terminated. Exit code=1
  • 最优估计准则与方法(6)递推最小二乘估计(RLS)_学习笔记
  • BeautifulSoup 使用详解与实战示例
  • 单链表的冒泡排序实现:从原理到代码详解
  • Windows 11 Qt 5.15.x 源码编译,支持C++20
  • MySQL进阶学习与初阶复习第四天
  • Canvas实现微信小程序图片裁剪组件全攻略
  • 在docker中安装frp实现内网穿透
  • Ubuntu简述及部署系统
  • 负载均衡 LoadBalance
  • web刷题
  • c++11--static_assert
  • Linux->自定义shell
  • FPGA IP升级
  • 网络服务综合项目
  • Oracle 数据库报 ora-00257 错误并且执行alter system switch logfile 命令卡死的解决过程