状态管理的艺术:探索Flutter的Provider库

状态管理的艺术:探索Flutter的Provider库

前言

上一篇文章中,我们详细介绍了 Flutter 应用中的状态管理,以及 StatefulWidgetsetState 的使用。

本篇我们继续介绍另一个实现状态管理的方式:Provider

Provider优缺点

基础介绍:

Provider 是一个轻量级的状态管理库,它使用 InheritedWidgetChangeNotifier 的概念来实现状态共享和更新。

Provider 允许我们在应用的任何位置访问和修改状态,并支持跨组件的状态共享。

优点:

(1)简单易用:提供了直观的 API,使得状态共享和更新变得简单。

(2)减少代码耦合:将状态管理逻辑与 UI 分离,提高了代码的可维护性和可重用性。

(3)支持跨组件状态共享:可以在应用的任何位置访问和修改状态。

缺点:

(1)性能考虑:虽然 Provider 优化了性能,但在大规模应用中仍需注意状态更新的效率和必要性。

(2)学习成本:对于初学者来说,需要一段时间来熟悉 Provider 的用法和原理。

使用步骤

1.添加 Provider 依赖

(provider 可自行选择,我这里选择了 6.0.5 版本 )

dependencies:flutter:sdk: flutterprovider: ^6.0.5

2.创建状态类

创建一个类来持有你的应用状态。这个类可以是简单的 Dart 类,包含一些属性和方法。

// 定义一个简单的状态类
class CounterState with ChangeNotifier {int _count = 0;int get count => _count;void increment() {_count++;notifyListeners();}
}

3.使用 Provider 包裹你的应用

在你的应用的根 widget 或者使用状态的部分 widget 的上面,使用 ChangeNotifierProvider 来包裹你的应用或 widget

ChangeNotifierProvider 接受一个 create 参数,这个参数是一个返回你创建的状态类的实例的函数。

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';void main() {runApp(// 使用Provider将状态包裹在顶层ChangeNotifierProvider(create: (context) => CounterState(),child: MyApp(),),);
}

4.在 widget 中使用状态

在你的 widget 中,使用 Consumer widget 或者 Provider.of<T>(context) 来访问和监听状态的变化。

当状态变化时,Consumer 会重新构建其子 widget

class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: Text('Provider Example')),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[// 使用Consumer来访问状态Consumer<CounterState>(builder: (context, counter, child) => Text('${counter.count}',style: TextStyle(fontSize: 24),),),RaisedButton(onPressed: () {// 使用Provider.of来访问状态并调用方法context.read<CounterState>().increment();},child: Text('Increment'),),],),),),);}
}

5.更新状态

在你的状态类中,当你需要更新状态时,直接修改状态类的属性,并确保你的状态类继承自 ChangeNotifier

在修改属性后,调用 notifyListeners() 方法来通知所有监听这个状态的 widget 进行更新。

class CounterState with ChangeNotifier {int _count = 0;int get count => _count;void increment() {_count++;notifyListeners();  // 通知所有监听这个状态的widget进行更新}
}

完整示例

在下面这个例子中,我们定义了一个 CounterState 类,它包含一个计数器和 increment 方法来增加计数。

我们使用 ChangeNotifierProvider 来将状态包裹在应用的顶层,并在需要的地方使用 ConsumerProvider.of 来访问和修改状态。

代码如下(示例):

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';// 定义一个简单的状态类
class CounterState with ChangeNotifier {int _count = 0;int get count => _count;void increment() {_count++;notifyListeners();}
}void main() {runApp(// 使用Provider将状态包裹在顶层ChangeNotifierProvider(create: (context) => CounterState(),child: MyApp(),),);
}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: Text('Provider Example')),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[// 使用Consumer来访问状态Consumer<CounterState>(builder: (context, counter, child) => Text('${counter.count}',style: TextStyle(fontSize: 24),),),ElevatedButton(onPressed: () {// 使用Provider.of来访问状态并调用方法context.read<CounterState>().increment();},child: Text('Increment')),],),),),);}
}

结果如下:

总结

Flutter 中,Provider 是一个非常流行的状态管理库,它允许你将状态(数据)在 widget 树中传递,而无需手动在每个 widget 层级上传递。

使用 Provider,你可以在应用的任何地方访问和更新状态,这使得状态管理变得更加简单和高效。

– 欢迎点赞、关注、转发、收藏【我码玄黄】,gonghao同名

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3248154.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【论文速读】| 涟漪下的漩涡:对启用RAG的应用程序的实证研究

本次分享论文&#xff1a;Vortex under Ripplet: An Empirical Study of RAG-enabled Applications 基本信息 原文作者&#xff1a;Yuchen Shao, Yuheng Huang, Jiawei Shen, Lei Ma, Ting Su, Chengcheng Wan 作者单位&#xff1a;East China Normal University, The Unive…

JVM基本知识——运行空间

JVM&#xff08;Java Virtual Machine&#xff09;即Java虚拟机&#xff0c;是负责读取java字节码&#xff0c;并在实际的硬件环境中运行。 JVM可以分为三部分&#xff1a;类装载器&#xff08;ClassLoader&#xff09;子系统、内存空间、执行引擎 内存空间&#xff08;运行时…

高职院校人工智能人才培养成果导向系统构建、实施要点与评量方法

一、引言 近年来&#xff0c;人工智能技术在全球范围内迅速发展&#xff0c;对各行各业产生了深远的影响。高职院校作为培养高技能人才的重要基地&#xff0c;肩负着培养人工智能领域专业人才的重任。为了适应社会对人工智能人才的需求&#xff0c;高职院校需要构建一套科学、…

【STC89C51单片机】定时器/计数器的理解

目录 定时器/计数器1. 定时器怎么定时简单理解&#xff08;加1经过了多少时间&#xff09;什么是时钟周期什么是机器周期 2.如何设置定时基本结构相关寄存器1. TMOD寄存器2. TCON寄存器 代码示例 定时器/计数器 STC89C51单片机的定时器和计数器&#xff08;Timers and Counter…

基于STM32老人摔倒报警设计

1.简介 随着我国老年人人口不断上升&#xff0c;我国已经进入人口老龄化&#xff0c;老龄人的人数加剧随着而来的就是基本的健康安全问题成为了如今社会主要解决的问题。随着已经步入信息时代&#xff0c;为了解决老年人的健康问题&#xff0c;相关技术的使用已经成为一个热门话…

JVM高频面试点

文章目录 JVM内存模型程序计数器Java虚拟机栈本地方法栈Java堆方法区运行时常量池 Java对象对象的创建如何为对象分配内存 对象的内存布局对象头实例数据对齐填充 对象的访问定位 垃圾收集器找到垃圾引用计数法可达性分析&#xff08;根搜索法&#xff09; 引用概念的扩充回收方…

COD论文学习 ZoomNext

现有方法的不足之处 高内在相似性&#xff1a;伪装物体与背景之间的高内在相似性使得检测变得困难&#xff0c;现有方法难以准确区分二者。多样化的规模和模糊的外观&#xff1a;伪装物体在规模和外观上多样化&#xff0c;且可能严重遮挡&#xff0c;导致现有方法难以处理。不…

【青书学堂】2024年第一学期 保险理论与实务(高起专) 作业

【青书学堂】2024年第一学期 保险理论与实务(高起专) 作业 为了方便日后复习&#xff0c;青书学堂成人大专试题整理。 若有未整理的课程&#xff0c;请私信我补充&#xff0c;欢迎爱学习的同学们收藏点赞关注&#xff01;文章内容仅限学习使用&#xff01;&#xff01;&#xf…

「C++」类和对象(1)

欢迎来到海盗猫鸥的博客~~ 本篇我们将学习部分C中的类和对象相关知识沃~ (• ω •)&#xff89;算我一个&#xff5e; 目录 类的定义 类的定义及使用 访问限定符 类域 实例化 实例化概念&#xff1a; 对象大小&#xff1a; 内存对齐规则&#xff1a; 注意点&#xff…

十二.核心动画 - 动画缓冲①(框架提供的缓存函数)

引言 上一篇博客我们已经讨论了Core Animation中时间的处理&#xff0c;以及CAMediaTiming协议。本篇博客我们就来看一下另外一个和时间有关的机制--缓冲。 缓冲会让动画看起来更平滑更自然&#xff0c;我们在本篇博客将会体验一下CAAnimation提供的缓存函数&#xff0c;UIVi…

TCP vs UDP:网络编程的双刃剑艺术

在浩瀚的网络编程世界里&#xff0c;TCP&#xff08;传输控制协议&#xff09;与UDP&#xff08;用户数据报协议&#xff09;如同两位性格迥异的剑客&#xff0c;各自以其独特的剑法与风格&#xff0c;在网络通信的舞台上独领风骚。今天&#xff0c;就让我们深入探索这两位网络…

【DevOps系列】DevOps简介及基础环境安装

作者&#xff1a;后端小肥肠 目录 1. 前言 2. DevOps&#xff08;详细介绍&#xff09; 3. Code阶段工具 3.1 Git安装 3.2 GitLab安装 4. Build阶段工具 5. Operate阶段工具 5.1 Docker安装 5.2 Docker-Compose安装 6. Integrate工具 6.1 Jenkins介绍 6.2 Jenkins安…

Axure中继器入门:打造你的动态原型

前言 中继器 是 Axure 中的一个高级功能&#xff0c;它能够在静态页面上模拟后台数据交互的操作&#xff0c;如增加、删除、修改和查询数据&#xff0c;尽管它不具备真实数据存储能力。 中继器就像是一个临时的数据库&#xff0c;为我们在设计原型时提供动态数据管理的体验&a…

Java二十三种设计模式-抽象工厂模式(3/23)

抽象工厂模式&#xff1a;复杂系统的灵活构建者 引言 在软件开发中&#xff0c;抽象工厂模式是一种提供接口以创建相关或依赖对象族的创建型设计模式。这种模式允许客户端使用一个共同的接口来创建不同的产品族&#xff0c;而无需指定具体类。 基础知识&#xff0c;java设计模…

Redis Cluster集群搭建只能正常启动一个怎么解决

Redis Cluster集群搭建只能正常启动一个怎么解决 建立redis集群时不小心就遇到了这问题 上图看 这两个都没有问题 接下来这个就出现问题啦 6380没有cluster集群 这个就是连不上 配置文件没错 看了几遍了 那该怎么办&#xff1f; 明明都一样的配置文件&#xff0c;为啥这…

成都亚恒丰创教育科技有限公司 【插画猴子:笔尖下的灵动世界】

在浩瀚的艺术海洋中&#xff0c;每一种创作形式都是人类情感与想象力的独特表达。而插画&#xff0c;作为这一广阔领域中的璀璨明珠&#xff0c;以其独特的视觉语言和丰富的叙事能力&#xff0c;构建了一个又一个令人遐想连篇的梦幻空间。成都亚恒丰创教育科技有限公司 在众多插…

解析DDD中的聚合对象

对象这个词对我们而言并不陌生。以最常见的面向对象为例&#xff0c;软件系统中的任何事物都被认为是一种对象。而针对如何设计和实现这些对象&#xff0c;也存在一批开发模式。例如&#xff0c;一种传统的做法是从数据的角度来规划对象的组织形式&#xff0c;先设计数据库模型…

甲骨文面试题【动态规划】力扣377.组合总和IV

给你一个由 不同 整数组成的数组 nums &#xff0c;和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保证答案符合 32 位整数范围。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3], target 4 输出&#xff1a;7 解释&#x…

QTableView仿Excel表头排序和筛选

一.效果 Excel的排序和筛选弹窗如下所示 功能非常强大。不仅支持内容排序和筛选,还支持颜色的排序和筛选,而且还支持设置多种过滤条件。本文只仿最常用的内容排序和内容单过滤条件的筛选,效果如下所示。 从效果图中可以看出,表头Section中的按钮有下列六种状态 enum Butt…

Redis 教程:从入门到入坑

目录 1. Redis 安装与启动1.1. 安装 Redis1.1.1. 在Linux上安装1.1.2. 在Windows上安装 1.2. 启动 Redis1.2.1. 在Linux上启动1.2.2. 在Windows上启动 1.3. 连接Redis1.3.1. 连接本地Redis1.3.2. 连接远程Redis1.3.2.1. 服务器开放端口1.3.2.2. 关闭防火墙1.3.2.3. 修改配置文件…