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

状态管理的艺术:探索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同名

相关文章:

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

状态管理的艺术&#xff1a;探索Flutter的Provider库 前言 上一篇文章中&#xff0c;我们详细介绍了 Flutter 应用中的状态管理&#xff0c;以及 StatefulWidget 和 setState 的使用。 本篇我们继续介绍另一个实现状态管理的方式&#xff1a;Provider。 Provider优缺点 基…...

玩转HarmonyOS NEXT之IM应用首页布局

本文从目前流行的垂类市场中&#xff0c;选择即时通讯应用作为典型案例详细介绍HarmonyOS NEXT的各类布局在实际开发中的综合应用。即时通讯应用的核心功能为用户交互&#xff0c;主要包含对话聊天、通讯录&#xff0c;社交圈等交互功能。 应用首页 创建一个包含一列的栅格布…...

GPT-4o大语言模型优化、本地私有化部署、从0-1搭建、智能体构建

原文链接&#xff1a;GPT-4o大语言模型优化、本地私有化部署、从0-1搭建、智能体构建https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247608565&idx3&snd4e9d447efd82e8dd8192f7573886dab&chksmfa826912cdf5e00414e01626b52bab83a96199a6bf69cbbef7f7fe…...

记录些MySQL题集(4)

1、数据库的三范式是什么&#xff1f; 第一范式&#xff1a;列不可再分 第二范式&#xff1a;在第一范式的基础上&#xff0c;要求数据库表中的所有非主键列完全依赖于主键&#xff0c;而不是仅依赖于主键的一部分 第三范式&#xff1a;满足第二范式的基础上&#xff0c;所有…...

pdf提取其中一页怎么操作?提取PDF其中一页的方法

pdf提取其中一页怎么操作&#xff1f;需要从一个PDF文件中提取特定页码的操作通常是在处理文档时常见的需求。这种操作允许用户选择性地获取所需的信息&#xff0c;而不必操作整个文档。通过选择性提取页面&#xff0c;你可以更高效地管理和利用PDF文件的内容&#xff0c;无论是…...

godot使用ws

go服务端 package mainimport ("encoding/json""fmt""github.com/gorilla/websocket""net/http" )var upgrader websocket.Upgrader{ReadBufferSize: 1024,WriteBufferSize: 1024, }// 处理函数 func handleWebSocket(w http.Respo…...

Windows FFmpeg 开发环境搭建

FFmpeg 开发环境搭建 FFmpeg命令行环境搭建使用FFmpeg官方编译的库Windows编译FFmpeg1. 下载[msys2](https://www.msys2.org/#installation)2. 安装完成之后,将安装⽬录下的msys2_shell.cmd中注释掉的 rem set3. 修改pacman 镜像源并安装依赖4. 下载并编译源码 FFmpeg命令行环境…...

链路聚合概述

目录 技术背景&#xff1a; 基本概念&#xff1a; 链路聚合的工作模式&#xff1a; 简介&#xff1a; 1&#xff09;Manual Load-balance&#xff08;手动负载分担&#xff09; 简介&#xff1a; 配置实施&#xff1a; 2&#xff09;LACP&#xff08;链路聚合控制协议&#xff…...

【链表】算法题(二) ----- 力扣/牛客

一、链表的回文结构 思路&#xff1a; 找到链表的中间节点&#xff0c;然后逆置链表的后半部分&#xff0c;再一一遍历链表的前半部分和后半部分&#xff0c;判断是是否为回文结构。 快慢指针找到链表的中间节点 slow指针指向的就是中间节点 逆置链表后半部分 逆置链表后半部分…...

合成复用原则

合成复用原则 (Composite Reuse Principle, CRP) 合成复用原则&#xff08;Composite Reuse Principle, CRP&#xff09;&#xff0c;也被称为组合/聚合复用原则&#xff0c;是面向对象设计中的一条重要原则。它的核心思想是&#xff1a;优先使用对象组合/聚合&#xff0c;而不…...

安卓自带camera hal3 实例README.md翻译

最近&#xff0c;遇到一个这样的问题&#xff0c;临时了解下这个驱动实现架构和特点&#xff0c;翻译如下 V4L2相机HALv3 camera.v4l2库使用视频Linux 2&#xff08;V4L2&#xff09;接口实现了camera HAL v3。这使得它在理论上可以与各种设备配合使用&#xff0c;尽管V4L2的…...

ActiViz实战:ActiViz中的自己实现鼠标双击事件

文章目录 1、添加鼠标事件2、网上实现双击事件的方式3、增加双击的时间限制4、补充说明1、添加鼠标事件 已知在C#中观察者/命令模式会报错,正常添加鼠标事件如下: private void VtkInteractorStyleTest() {vtkInteractorStyle style = vtkInteractorStyle.New();style.LeftB…...

Linux-交换空间(Swap)管理

引入概念 在计算机中&#xff0c;硬盘的容量一般比内存大&#xff0c;内存&#xff08;4GB 8GB 16GB 32GB 64GB…&#xff09;&#xff0c;硬盘&#xff08;512GB 1T 2T…&#xff09;。 冯诺依曼的现代计算机结构体系里面的存储器就是内存 内存是一种易失性存储器&#xff0c…...

扫描某个网段下存活的IP:fping

前言&#xff1a; 之前用arp统计过某网段下的ip&#xff0c;但是有可能统计不全。网络管理平台又不允许登录。想要知道当前的ip占用情况&#xff0c;可以使用fping fping命令类似于ping&#xff0c;但比ping更强大。与ping需要等待某一主机连接超时或发回反馈信息不同&#x…...

【深度学习】PyTorch框架(3):优化与初始化

1.引言 在本文中&#xff0c;我们将探讨神经网络的优化与初始化技术。随着神经网络深度的增加&#xff0c;我们会遇到多种挑战。最关键的是确保网络中梯度流动的稳定性&#xff0c;否则可能会遭遇梯度消失或梯度爆炸的问题。因此&#xff0c;我们将深入探讨以下两个核心概念&a…...

Go-知识测试-子测试

Go-知识测试-子测试 1. 介绍2. 例子3. 子测试命名规则4. 选择性执行5. 子测试并发6. testing.T.Run7. testing.T.Parallel8. 子测试适用于单元测试9. 子测试适用于性能测试10. 总结10.1 启动子测试 Run10.2 启动并发测试 Parallel 建议先看&#xff1a;https://blog.csdn.net/a…...

.net core IConfiguration 读 appsettings.json 数据,举例

在.NET Core中&#xff0c;IConfiguration 接口是用来读取配置数据的&#xff0c;包括从 appsettings.json 文件中读取。下面是一个如何在使用.NET Core时通过 IConfiguration 读取 appsettings.json 数据的示例。 首先&#xff0c;假设你的 appsettings.json 文件内容如下&am…...

全球Windows机器蓝屏,作为量化人,我的检讨来了

昨天下午&#xff0c;微软给大家放了个假。Windows又双叒死机了。不过&#xff0c;这一次不是几台机器&#xff0c;而是全球大范围宕机。这一刻&#xff0c;大家都是“正蓝旗”。 蓝瓶的&#xff0c;效果好&#xff01; 现在根本原因已经找到&#xff0c;绝大多数人的机器都已修…...

部署和运维

目录 1.Git1.1. Git指令中merge和rebase的区别1. Commit 记录2. 合并方式3. 冲突处理4. 使用场景选择建议 1.2. cherry-pick的使用如何使用 git cherry-pick例子处理冲突撤销 cherry-pick其他选项 结论 2. 部署1. Nginx的使用场景 编译打包1. webpack2. webpack打包优化1. 代码…...

微信小程序基本语法

官网 https://developers.weixin.qq.com/miniprogram/dev/framework/ 视频教程&#xff1a;尚硅谷微信小程序开发教程&#xff0c;2024最新微信小程序项目实战&#xff01; 仿慕尚花坊项目源码&#xff1a;https://gitee.com/abcdfdewrw/flower-workshop 目录 一&#xff0c;初…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...