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

Flutter鸿蒙next 状态管理高级使用:深入探讨 Provider

✅近期推荐:求职神器

https://bbs.csdn.net/topics/619384540


🔥欢迎大家订阅系列专栏:flutter_鸿蒙next
💬淼学派语录:只有不断的否认自己和肯定自己,才能走出弯曲不平的泥泞路,因为平坦的大路,太tm无趣了!

目录

写在前面

一、Provider 概述

二、Provider 的基本用法回顾

三、高级用法

1. 组合多个 Provider

2. 使用 Provider 的 Selector

3. 使用 ChangeNotifierProxyProvider

4. 自定义 Provider

写在最后


写在前面

在 Flutter 开发中,状态管理是一个至关重要的主题。Flutter 提供了多种状态管理方案,其中 Provider 是最流行和灵活的选择之一。本文将深入探讨 Provider 的高级用法,以帮助开发者更好地理解和应用这一强大的状态管理工具。

一、Provider 概述

Provider 是一个 Flutter 插件,旨在简化状态管理。它通过依赖注入和通知机制,使得构建响应式应用变得更加容易。Provider 的核心理念是将数据和状态集中管理,并使这些数据能在不同的 Widget 树中共享。

二、Provider 的基本用法回顾

在开始高级用法之前,让我们回顾一下 Provider 的基本用法。

  1. 安装 Provider

    pubspec.yaml 中添加依赖:

    yaml

    dependencies: flutter: sdk: flutter provider: ^6.0.0
  2. 创建一个模型类

    创建一个简单的计数器模型:

    import 'package:flutter/material.dart';class Counter with ChangeNotifier {int _count = 0;int get count => _count;void increment() {_count++;notifyListeners();}
    }
    

  3. 使用 Provider 提供状态

    main.dart 中使用 Provider 包裹你的应用:

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

  4. 在 Widget 中消费状态

    在需要的地方使用 ConsumerProvider.of 来获取状态:

    class MyHomePage extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Provider Example'),),body: Center(child: Consumer<Counter>(builder: (context, counter, child) {return Text('Count: ${counter.count}');},),),floatingActionButton: FloatingActionButton(onPressed: () {Provider.of<Counter>(context, listen: false).increment();},child: Icon(Icons.add),),);}
    }
    

三、高级用法

1. 组合多个 Provider

在复杂的应用中,可能会有多个状态需要管理。Provider 允许你将多个 Provider 组合使用。

class User with ChangeNotifier {String _name = '';String get name => _name;void updateName(String newName) {_name = newName;notifyListeners();}
}// 在 main.dart 中组合多个 Provider
void main() {runApp(MultiProvider(providers: [ChangeNotifierProvider(create: (context) => Counter()),ChangeNotifierProvider(create: (context) => User()),],child: MyApp(),),);
}

通过 MultiProvider,你可以在同一个 Widget 树中使用多个状态。

2. 使用 Provider 的 Selector

当你只想监听某个模型的特定属性时,可以使用 Selector,这可以提高性能。

Selector<Counter, int>(selector: (context, counter) => counter.count,builder: (context, count, child) {return Text('Count: $count');},
);

Selector 只会在选择的属性变化时重新构建,因此在某些情况下,可以减少不必要的 Widget 重建。

3. 使用 ChangeNotifierProxyProvider

当一个模型依赖于另一个模型时,可以使用 ChangeNotifierProxyProvider。这使得依赖关系管理变得更加清晰。

class AuthService with ChangeNotifier {String _userId;String get userId => _userId;void login(String id) {_userId = id;notifyListeners();}
}class UserProfile with ChangeNotifier {final AuthService authService;UserProfile(this.authService);String get profile => 'Profile for user: ${authService.userId}';
}// 在 main.dart 中使用 ChangeNotifierProxyProvider
void main() {runApp(ChangeNotifierProvider(create: (context) => AuthService(),child: ChangeNotifierProxyProvider<AuthService, UserProfile>(create: (context) => UserProfile(Provider.of<AuthService>(context, listen: false)),update: (context, authService, userProfile) => UserProfile(authService),child: MyApp(),),),);
}

这样,UserProfile 就可以直接访问 AuthService 的状态。

4. 自定义 Provider

如果你有特定的需求,可以创建自己的 Provider。以下是一个简单的示例,使用 ValueNotifier 来实现一个计数器。

class CustomCounterProvider extends ValueNotifier<int> {CustomCounterProvider() : super(0);void increment() {value++;}
}// 使用自定义 Provider
void main() {runApp(ChangeNotifierProvider(create: (context) => CustomCounterProvider(),child: MyApp(),),);
}// 在 Widget 中使用
ValueListenableBuilder<int>(valueListenable: Provider.of<CustomCounterProvider>(context),builder: (context, count, child) {return Text('Count: $count');},
);

写在最后

Provider 是 Flutter 状态管理的一个强大工具,适用于各种复杂程度的应用。通过组合多个 Provider、使用 SelectorChangeNotifierProxyProvider,你可以创建一个高效、可维护的应用。

对于大多数应用而言,Provider 提供了一种优雅而强大的方式来管理状态。随着你对 Flutter 和 Provider 的深入理解,你将能够构建出更复杂和功能丰富的应用。

相关文章:

Flutter鸿蒙next 状态管理高级使用:深入探讨 Provider

✅近期推荐&#xff1a;求职神器 https://bbs.csdn.net/topics/619384540 &#x1f525;欢迎大家订阅系列专栏&#xff1a;flutter_鸿蒙next &#x1f4ac;淼学派语录&#xff1a;只有不断的否认自己和肯定自己&#xff0c;才能走出弯曲不平的泥泞路&#xff0c;因为平坦的大路…...

JMeter实战之——模拟登录

本篇介绍使用JMeter 如何对需要登录的站点进行压力测试。 基本Session验证的机制 使用session进行请求验证的机制是一种常见的Web应用认证方式。 该认证方式的主要内容如下&#xff1a; 一、登录过程 用户输入&#xff1a;用户在登录页面输入用户名和密码。发送请求&#x…...

智能台灯设计(一)原理图设计

1. 前言 作者最近突发奇想&#xff0c;想自己做一个小台灯&#xff0c;设想的功能有&#xff1a;带锂电池可充电、可以调节亮度&#xff0c;后续通过增加WIFI模块实现手机控制开关功能。目前先实现最简单的功能&#xff0c;有时间再一步步完善吧。 2. 原理图设计 充电芯片使用…...

数据库查询返回结果集及其元数据信息:ResultSet 和 ResultSetMetaData 深度解析

全文目录&#xff1a; 开篇语&#x1f4cc; 目录&#x1f31f; 前言&#x1f4dd; 摘要&#x1f4da; 简介&#x1f50d; 概述&#x1f9e9; 核心源码解读1️⃣ 创建数据库连接2️⃣ 执行查询获取结果集3️⃣ 读取查询数据4️⃣ 获取元数据信息 &#x1f4bb; 案例分析&#x1…...

2.插入排序(斗地主起牌)

一、思想 扑克牌起牌 代码&#xff1a; 二、时间复杂度&#xff1a; 最好情况&#xff08;已经排序好的&#xff09;&#xff1a;T O(N) 最坏情况&#xff08;完全逆序&#xff09;&#xff1a;T O(N^2) 三、优劣&#xff1a; 严格的大小比较之后才进行错位插入&#x…...

漫谈编程小白如何成为大神:夯实基础,开启通神之路

在当今数字化时代&#xff0c;编程已成为一项基本技能&#xff0c;对于大学新生而言&#xff0c;掌握编程能力不仅能够为学术研究提供支持&#xff0c;还能为未来的职业生涯开辟广阔天地。然而&#xff0c;面对琳琅满目的编程语言和学习资源&#xff0c;新生们往往会感到迷茫和…...

基于机器学习的个性化电影推荐系统【源码+安装+讲解+售后+文档】

【1】系统介绍 研究背景 随着互联网技术的迅速发展&#xff0c;数字娱乐内容特别是电影和电视剧的数量急剧增加。用户在享受丰富内容的同时&#xff0c;也面临着选择困难的问题&#xff0c;即“信息过载”。传统的搜索和分类方法已经无法满足用户日益增长的个性化需求。与此同…...

企业如何配合好等级保护测评工作?

企业如何配合好等级保护测评工作&#xff0c;是一个涉及多方面因素的系统性任务。等级保护测评&#xff0c;简称等保测评&#xff0c;是中国对信息和信息系统安全的重要管理手段和评估制度。通过这一制度&#xff0c;企业可以全面了解其信息系统的安全状况&#xff0c;及时发现…...

Could not find artifact cn.hutool:hutool-all:jar:8.1 in central 导入Hutool报错

<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.9</version></dependency> 引入hutool 8.1版本的工具…...

【功能安全】汽车功能安全个人认证证书

目录 1、证书 2、课程信息 &#x1f4d6; 推荐阅读 1、证书 汽车功能安全工程师去拿类似莱茵、SGS、南德颁发的证书&#xff0c;如下&#xff1a; 2、课程信息 一般上什么课程了&#xff0c;课程信息大概如下&#xff1a; 汽车功能安全工程师认证课 &#xff08;3天&#…...

axios直接上传binary

axios直接上传二进制文件 、 axios直接上传apk、axios直接上传binary postman中的参数选项中有个binary&#xff0c;平常我们很少使用&#xff0c;可能有的同学遇到这种情况不太会了&#xff0c;认为后端应该有个字段名来接收&#xff0c;或者使用 Formdata&#xff0c;但其实…...

量化交易API接口是什么?如何申请和应用?

炒股自动化&#xff1a;申请官方API接口&#xff0c;散户也可以 python炒股自动化&#xff08;0&#xff09;&#xff0c;申请券商API接口 python炒股自动化&#xff08;1&#xff09;&#xff0c;量化交易接口区别 Python炒股自动化&#xff08;2&#xff09;&#xff1a;获取…...

语义分割:YOLOv11的分割模型训练自己的数据集(从代码下载到实例测试)

文章目录 前言一、环境搭建二、构建数据集三、修改配置文件①数据集文件配置②模型文件配置 四、模型训练和测试模型训练模型验证模型推理 总结 前言 专栏目录&#xff1a;YOLOv11改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改…...

Python爬虫:从入门到精通

Python爬虫&#xff1a;从入门到精通 在数字时代&#xff0c;信息就如同水源&#xff0c;源源不绝。然而&#xff0c;当你想要从海量的信息中汲取有价值的“水”&#xff0c;你会发现这并不是一件容易的事。这就是为什么网络爬虫出现了。它们帮助我们在网络的海洋中航行&#…...

Web组态软件

Web组态软件是近年来前端开发领域的一股新兴力量&#xff0c;它以其独特的魅力吸引着越来越多的开发者们。那么&#xff0c;Web组态软件到底是什么&#xff1f;它有哪些特点&#xff1f;我们又该如何选择和使用它呢&#xff1f;下面&#xff0c;就让我们一起探讨这些问题。 一…...

Java中为什么要私有化构造方法

为什么要私有化构造方法 要私有化的方法不是来描述一类事物的&#xff0c;创建没有任何意义 解决方案&#xff1a; 提示&#xff1a;这里填写该问题的具体解决方案&#xff1a; 为什么要将构造方法私有化&#xff1f; 问&#xff1a;如果要限制一个类对象产生&#xff0c;即&…...

【大数据学习 | kafka】kafuka的基础架构

1. kafka是什么 Kafka是由LinkedIn开发的一个分布式的消息队列。它是一款开源的、轻量级的、分布式、可分区和具有复制备份的&#xff08;Replicated&#xff09;、基于ZooKeeper的协调管理的分布式流平台的功能强大的消息系统。与传统的消息系统相比&#xff0c;KafKa能够很好…...

2-petalinux2018.3摸索记录-petalinux rootfs

1Filesystem Packages文件系统软件包2Petalinux Package GroupsPetalinux软件包组3Image Features镜像特性4apps应用程序5user packages用户软件包6Petalinux RootFS SettingsPetalinux根文件系统设置 Filesystem Packages&#xff08;文件系统软件包&#xff09; 这个选项主要…...

RHCE作业二

1.要求&#xff1a; 配置nginx服务通过ip访问多网站 2. 1关闭防火墙 2创建ip 3配置 4创建文件 5测试...

GPS/北斗时空安全隔离装置(卫星时空防护装置)使用手册

GPS/北斗时空安全隔离装置(卫星时空防护装置)使用手册 GPS/北斗时空安全隔离装置(卫星时空防护装置)使用手册 时空安全隔离装置采用先进的防欺骗抗干扰技术&#xff0c;能够有效检测识别欺骗干扰信号&#xff0c;并快速对异常信号进行关断、切换&#xff0c;消除欺骗干扰影响。…...

【C++篇】深度解析类与对象(下)

引言 在上一篇博客中&#xff0c;我们学习了C的基础类与对象概念&#xff0c;包括类的定义、对象的使用和构造函数的作用。在这一篇&#xff0c;我们将深入探讨C类的一些重要特性&#xff0c;如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象&#xff0c;…...

【gRPC】什么是RPC——介绍一下RPC

说起RPC&#xff0c;博主使用CPP手搓了一个RPC项目&#xff0c;RPC简单来说&#xff0c;就是远程过程调用&#xff1a;我们一般在本地传入数据进行执行函数&#xff0c;然后返回一个结果&#xff1b;当我们使用RPC之后&#xff0c;我们可以将函数的执行过程放到另外一个服务器上…...

谈谈你对AQS的理解

AQS 是多线程同步器&#xff0c;它是 JUC 包中多个组件的底层实现&#xff0c;如 Lock、CountDownLatch、Semaphore等都用到了AQS。 从本质上来说&#xff0c;AQS 提供了两种锁机制&#xff0c;分别是排它锁&#xff0c;和共享锁。 排它锁&#xff0c;就是存在多线程竞争同一…...

Bitcoin全节点搭建

1. wget https://bitcoincore.org/bin/bitcoin-core-0.20.1/bitcoin-0.20.1-x86_64-linux-gnu.tar.gz 2.tar -xzvf bitcoin-0.20.1-x86_64-linux-gnu.tar.gz mv bitcoin-0.20.1 bitcoin 3.创建配置文件&#xff08;bitcoin.conf&#xff09; mkdir -p /btc_data mkdir ~/.b…...

【mysql进阶】4-6. InnoDB 磁盘文件

InnoDB 磁盘⽂件 1 InnoDB存储引擎包含哪些磁盘⽂件&#xff1f; &#x1f50d; 分析过程 ✅ 解答问题 InnoDB的磁盘⽂件主要是表空间⽂件和其他⽂件&#xff0c;表空间包括&#xff1a;系统表空间、独⽴表空间、通⽤表空间、临时表空间和撤销表空间&#xff1b;其他⽂件有重做…...

HexForge:一款用于扩展安全汇编和十六进制视图的IDA插件

关于HexForge HexForge是一款用于扩展安全汇编和十六进制视图的IDA插件&#xff0c;在该工具的帮助下&#xff0c;广大研究人员可以方便地直接从 IDA Pro 界面数据解码、解密或执行安全数据审计任务。 功能介绍 1、从 IDA 的反汇编或十六进制视图复制原始十六进制&#xff1b;…...

WORFBENCH:一个创新的评估基准,目的是全面测试大型语言模型在生成复杂工作流 方面的性能。

2024-10-10,由浙江大学和阿里巴巴集团联合创建的WORFBENCH&#xff0c;一个用于评估大型语言模型&#xff08;LLMs&#xff09;生成工作流能力的基准测试。它包含了一系列的测试和评估协议&#xff0c;用于量化和分析LLMs在处理复杂任务时分解问题和规划执行步骤的能力。WORFBE…...

SpringBoot 集成 Activiti 7 工作流引擎

一. 版本信息 IntelliJ IDEA 2023.3.6JDK 17Activiti 7 二. IDEA依赖插件安装 安装BPM流程图插件&#xff0c;如果IDEA的版本超过2020,则不支持actiBPM插件。我的IDEA是2023版本我装的是 Activiti BPMN visualizer 插件。 在Plugins 搜索 Activiti BPMN visualizer 安装创建…...

UVM初学篇 -(22)UVM field_automation 域的自动化机制

field_automation机制是域的自动化的机制&#xff0c;这个机制的最大的优点是可以对一些变量进行批量的处理&#xff0c;比如对象拷贝、克隆、打印之类的变量。 一、 成员变量的注册 使用field_automation机制首先要用uvm_field 系列宏完成变量的注册&#xff0c;类中的成员变…...

STL二分查找

本课主要介绍容器部分里面的二分查找函数。涉及的函数有 3 个&#xff0c;这 3 个函数的强两个输入参数都和迭代器有关&#xff0c;或者说参数是可以迭代的&#xff0c;而第三个参数则是你要查找的值。 1. binary_search binary_search 的返回结果是 bool 值&#xff0c;如果找…...

wordpress做门户网/南昌seo专业团队

java jcp昨天&#xff0c;亚马逊宣布他们已加入Java Community Process 。 AWS开发人员工具中的Artifacts and Languages组经理Yishai Galatzer在一篇博客文章中写道&#xff1a;“亚马逊运行着数千种Java生产服务&#xff1b; 我们和我们的客户都严重依赖JDK&#xff08;Java开…...

关于做网站的问卷调查/美容美发培训职业学校

什么是单元测试&#xff1f; 程序开发过程中&#xff0c;写代码是为了实现需求。当我们的代码通过了编译&#xff0c;只是说明它的语法正确&#xff0c;功能能否实现则不能保证。 因此&#xff0c;当我们的某些功能代码完成后&#xff0c;为了检验其是否满足程序的需求。可以通…...

通州青岛网站建设/国内最好的搜索引擎

前言&#xff1a;前面的几篇文章都是记录tushare先写入本地硬盘变成csv格式&#xff0c;然后再从csv取数据进行分析再导入mysql。以下代码是直接将tushare获取到数据直接导入mysql&#xff0c;先大体放出简单代码&#xff0c;后面再记录完善的代码&#xff1a; import pandas …...

wordpress旅行地图主题/成人职业培训机构

第九届北京高中数学知识应用竞赛初赛 第二题原题&#xff1a;一只老鼠为了躲避猫的追捕&#xff0c;跳入了半径为&#xff32;的圆形湖中&#xff0e;猫不会游泳&#xff0c;只能沿湖岸追击&#xff0c;并且总是试图使自己离老鼠最近(即猫总是试图使自己在老鼠离岸最近的点上)…...

网站首页怎么用dw做/外贸推广建站

在oracle数据库开发应用中&#xff0c;查询时间date类型的sql比较多&#xff0c;我相信大家也见过“trunc(created)>TO_DATE(2013-12-14, YYYY-MM-DD)”这类的写法&#xff0c;这样写真的好吗&#xff1f;下面我们做过实验 大家看到了吧&#xff1f;好不好的我就不说了&…...

深圳软件项目定制开发费用/网站排名优化技巧

快速上手php&#xff1a;使用PhpStrom调试php闲话 使用phpStrom的时候居然不打印到控制台,要打印测试的话就要输出到页面,目前我还不知道有什么好办法像jsp一样输出到页面的同时也打印到控制台.这种做法还是比较烦的,特别出问题需要调试的时候. ...Asp&period;net使用代码修…...