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

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.dtcms.com/a/301376.html

相关文章:

  • 力扣热题100----------53最大子数组和
  • 咨询进阶——解读40页公司战略解码方法【附全文阅读】
  • sed命令
  • 通信名词解释:I2C、USART、SPI、RS232、RS485、CAN、TCP/IP、SOCKET、modbus
  • 【通识】设计模式
  • catkin_make生成的编译文件夹目录结构说明
  • uart通信
  • python---类型转换
  • Milvus 实战全流程
  • Deja Vu: 利用上下文稀疏性提升大语言模型推理效率
  • Spring 解析 XML 配置文件的过程(从读取 XML 到生成 BeanDefinition)
  • 扩展组件(uni-ui)之uni-group
  • 「iOS」————消息传递和消息转发
  • 26.删除有序数组中的重复项
  • MyBatis-Plus高效开发实战
  • 内存管理和垃圾收集-02: 操作系统如何管理内存?
  • Linux驱动开发笔记(五)——设备树(中)——节点的标准属性
  • 益莱储:明智地投资测试仪器
  • S7-1500 与 S7-1200 存储区域保持性设置特点详解
  • 电子板原理功能区解析与PlantUML图示
  • 3,Windows11安装docker保姆级教程
  • 轻量化多模态文档处理利器SmolDocling:技术原理与场景落地引言:文档智能处理的范式革命
  • 数据结构基础内容(第六篇:二叉搜索与平衡二叉树)
  • MySQL锁机制与MVCC原理剖析
  • 直播带货工具About v1.5.10 免费版
  • GEO优化实战:如何在DeepSeek、豆包等AI平台抢占推荐位?
  • MOE架构详解:原理、应用与PyTorch实现
  • 计算圆周率(π)代码实现【c++】
  • Java中排序规则详解
  • cJSON在STM32单片机上使用遇到解析数据失败问题