Flutter之riverpod状态管理详解

一、riverpod状态管理中所涉及到的provider对比分析

Provider 类型核心用途最佳适用场景优势劣势/注意事项

Provider(v1)

暴露一个恒定不变的(或不需要Riverpod管理的)对象或值。依赖注入(如:Repository, Logger, ApiClient)、常量、已存在的对象实例。极其简单、高效。用于将对象提供给整个应用。不能用于管理会变化的“状态”。它创建的对象在其生命周期内是固定的。

StateProvider(v1)

管理一个简单的、可变的状态,通常是一个基本类型(如:enum, int, bool, String)。简单的 UI 状态:计数器、开关切换、单选按钮、文本字段过滤。非常简单易用,用于处理局部、简单的状态。不适合复杂的业务逻辑。状态变更逻辑分散在UI中(通过ref.read(.notifier).state++)。
StateNotifierProvider (v1)Riverpod 1.x 的标准方式,用于管理复杂的、不可变的状态,并集中封装修改状态的业务逻辑管理复杂对象的状态:购物车、表单验证、游戏状态、需要测试的业务逻辑。逻辑与UI分离。状态不可变,更可预测。易于测试。集中所有业务逻辑。是 NotifierProvider 的前身。已“软弃用”。需要额外的 StateNotifier 类。异步操作需要手动处理加载/错误状态,不如 AsyncNotifierProvider 方便。

FutureProvider(v1)

暴露一个异步值(Future),并处理其加载、错误和数据状态。获取一次性异步数据:API 调用、本地存储读取、一次性计算。内置加载/错误/数据状态处理(通过AsyncValue),极大简化异步UI编程。不适合会随时间变化的数据(用StreamProvider)或需要刷新的数据(用AsyncNotifierProvider)。

StreamProvider(v1)

暴露一个数据流(Stream),并监听其发出的值。监听实时数据:Firestore 监听、WebSocket 连接、传感器数据。与 FutureProvider 类似,完美集成 AsyncValue,自动处理流的事件。仅用于监听,不用于修改或执行业务逻辑。

NotifierProvider(v2)

Riverpod 2.x 的标准方式,用于管理复杂的、不可变的状态,并集中封装修改状态的业务逻辑管理复杂对象的状态:购物车、表单验证、游戏状态、需要测试的业务逻辑。逻辑与UI分离。状态不可变,更可预测。易于测试。集中所有业务逻辑。需要创建额外的 Notifier 类,对于简单状态稍显繁琐。
AsyncNotifierProvider (v2)NotifierProvider 的异步版本,用于管理一个需要异步初始化或操作的复杂状态。需要异步初始化或保存的状态:用户认证状态、需要从网络/本地加载的配置文件。结合了 FutureProvider 的异步能力和 NotifierProvider 的业务逻辑封装能力。是较新的API,需要理解 AsyncValue 在状态类中的使用。

StateNotifierProvider vs. NotifierProvider对比:

相同点

特性维度StateNotifierProvider (旧/经典版)NotifierProvider (新/现代版)说明
核心目的管理复杂的、可变的应用状态,并将业务逻辑与UI彻底分离完全一致。两者都旨在取代在Widget中处理复杂逻辑的模式,适用于如购物车、表单、列表数据管理等相同场景。
状态管理哲学基于不可变状态单向数据流。通过创建新状态实例来更新,而非修改原状态。完全一致。这是两者最重要的共同理念。状态变化可预测、可调试,是构建稳健应用的基础。
架构模式UI → 调用方法 → Notifier处理逻辑 → 产生新状态 → 通知监听者 → UI更新完全一致。两者都遵循完全相同的状态变化流程和架构模式,StateNotifier/Notifier 类都充当状态和逻辑的集中容器。
对外使用接口ref.watch(provider) 读取状态
ref.read(provider.notifier).method() 调用方法
完全一致。对于Widget或其他Provider来说,使用方式没有任何区别,迁移成本低。
可测试性极佳。业务逻辑独立于UI,可直接实例化类进行单元测试。极佳。完全相同的优势。都鼓励将逻辑封装在独立的类中,使其易于在不依赖Flutter框架的情况下进行测试。
性能优化机制仅在状态引用变更(state != oldState)时通知监听者重建。完全一致。共享相同的性能优化策略,鼓励使用不可变数据来高效地进行相等性比较,避免不必要的重建。
在Riverpod中的角色Riverpod 1.x 时代管理复杂状态的主力解决方案Riverpod 2.x 时代管理复杂状态的官方推荐继承者它们是同一设计思想在不同时期的具体实现,后者是前者的现代化演进。

不同点

特性StateNotifierProvider (旧)NotifierProvider (新)
定义方式需手动创建类和 Provider可手动创建,但推荐用 @riverpod 注解自动生成
代码量模板代码多使用代码生成后,模板代码极少
官方支持已“软弃用”,维护模式当前和未来的推荐标准
开发体验需要手动管理 ref 传递自动化程度高,ref 内置,开发流畅
与框架集成相对松散,StateNotifier 是一个独立包。紧密集成,是 flutter_riverpod 的一部分。

FutureProvider vs. AsyncNotifierProvider对比:

相同点

特性FutureProviderAsyncNotifierProvider说明
处理异步性两者核心都是为了管理和暴露一个异步操作的结果。
状态封装都使用 AsyncValue 来封装加载中(loading)数据(data) 和错误(error) 三种状态。
UI 集成在 Widget 中,都可以使用 .when.map 等方法来根据 AsyncValue 的不同状态渲染不同的UI。
依赖关系都可以通过 ref.watch 来依赖其他 Provider,并在其依赖更新时自动重新执行(FutureProvider 的 build 会重新运行,AsyncNotifier 的 build 会重新运行)。

不同点

特性FutureProviderAsyncNotifierProvider
设计初衷获取并暴露一个一次性异步值管理一个需要异步操作或初始化的复杂可变状态
业务逻辑封装❌ 。通常只在 build 函数内进行简单的数据获取和转换。✅ 。将所有相关的业务逻辑(初始化、修改、保存)都封装在 AsyncNotifier类的方法中。
状态更新方式间接且被动。通过改变其依赖项来触发 build 函数重新执行,从而生成新的 Future直接且主动。通过调用 AsyncNotifier 类上的方法(如 updateUserrefreshData)来直接、精确地更新状态。
刷新策略通常使用 ref.refresh(myFutureProvider) 来强制整体重置,重新执行整个 Future可以在方法内实现精细化刷新(如只刷新部分数据、乐观更新等),无需重置整个状态。
代码组织逻辑简单时很简洁,但复杂时容易变得臃肿且难以维护(例如需要在 family 参数中处理多个参数)。天生为复杂场景设计。多个相关操作被组织在类的方法里,代码结构清晰,更易维护和测试。
典型场景获取一次用户信息、查询单个API、读取本地配置。用户身份认证管理(登录、登出、注册)、可编辑的用户个人资料、复杂的异步表单提交。

说明与影响:最根本的区别,FutureProvider 用于“获取”,AsyncNotifierProvider 用于“管理”。

复杂对象的同步状态 VS  异步状态

特性NotifierProvider / StateNotifierProviderFutureProvider / AsyncNotifierProvider
状态类型T (e.g., List<Todo>)AsyncValue<T> (包装了 loading/data/error)
初始状态同步获取 (build())异步获取 (异步 build() 或 Future)
读取状态ref.watch(provider) 直接返回 Tref.watch(provider) 返回 AsyncValue<T>
UI 中使用直接使用 state必须使用 .when() 或模式匹配来处理 loading/error 状态
异步处理手动管理:需要在方法内部用 try/catch 自己处理加载中和错误状态,并同步地更新 state自动管理:框架自动处理 AsyncValue 的 loading/error 状态转换。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

昇腾310i Pro固件说明

目录 驱动和固件 驱动固件文件 firware固件 24.2版本对应的固件 驱动和固件共同文件 烧结到flash中的固件 总结 启动流程 固件关系猜测 启动关键信息 efuse atu大小 GPU的bar 总结 驱动和固件 以最新的25.2 对应的驱动和固件为例说明&#xff1a; 驱动固件文件…

【LeetCode热题100道笔记】二叉树的右视图

题目描述 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5,null,4] 输出&#xff1a;[1,3,4] 解释&#xff1a;示例 2&am…

Redis《RedisSerializer》

文章目录RedisSerializer为什么要使用如何使用RedisSerializer总结RedisSerializer 为什么要使用 RedisTemplate 有默认的序列化器&#xff0c;但默认使用的 JdkSerializationRedisSerializer 存在一些问题&#xff1a; 序列化后的数据包含类信息等额外内容&#xff0c;导致…

基于开源AI大模型AI智能名片S2B2C商城小程序的文案引流与社交传播运营策略研究

摘要&#xff1a;本文聚焦开源AI大模型AI智能名片S2B2C商城小程序&#xff0c;探讨其文案引流与社交传播运营策略。阐述文案在引流中的重要性&#xff0c;分析开源AI大模型AI智能名片S2B2C商城小程序的特性&#xff0c;研究文案设计策略、社交传播机制及运营策略实施与效果评估…

NGINX vs HAProxy vs LVS:优势与选型分析

目录 1. 负载均衡的江湖:三巨头初探 2. NGINX:全能选手的多面魅力 NGINX 核心优势 NGINX 的短板 NGINX 实战案例 3. HAProxy:调度大师的精细之道 HAProxy 核心优势 HAProxy 的短板 HAProxy 实战案例 4. LVS:内核猛兽的极致性能 LVS 核心优势 LVS 的短板 LVS 实…

AI+ 行动意见解读:音视频直播SDK如何加速行业智能化

引言&#xff1a;国家战略、技术基座与行业落地 8 月底&#xff0c;国务院发布了《“人工智能”行动意见》&#xff0c;明确将人工智能提升为继“互联网”之后的新一轮国家级战略抓手。这份文件的关键词已经不再是“连接”与“优化”&#xff0c;而是“重塑”与“跃迁”&#…

2025年华为HCIA人工智能认证发展前景如何?客观分析!

大家好&#xff01;7月世界人工智能大会即将揭幕首款重载机器人&#xff0c;AI产业化进程再次加速。不少朋友开始转移关注到和它有一点点关系的——华为HCIA-AI Solution认证&#xff08;人工智能解决方案工程师&#xff09;&#xff0c;但它是否真能搭上这趟技术快车&#xff…

AutoGPT 原理与实践:从AI助理到“自主任务完成者” (人工智能入门系列)

Elon Musk 曾预言&#xff0c;“AIAgent 终将比人类聪明&#xff0c;并能自动完成大部分工作&#xff0c;这既是机遇也是威胁。” 而 AutoGPT&#xff0c;正是当前 AI 领域涌现出的、最能体现这一预言雏形的产品。它不再是那个需要你一句一句精确指令的“AI助手”&#xff0c;而…

自适应滤波器:Ch4 最小均方(LMS)算法

随机梯度下降算法简介 之前的章节中介绍了利用最速下降算法可以实现维纳滤波器的最优解&#xff08;LMMSE&#xff09;&#xff0c;其最优解的形式为&#xff1a; w0R−1Pw_{0} R^{- 1}Pw0​R−1P 它基于两个假设&#xff1a;环境的联合平稳&#xff0c;即输入u(n)u(n)u(n)以及…

AI生成内容的版权问题解析与实操指南

针对个人使用AI工具生成视频/音乐的版权问题深度解析&#xff0c;从法律归属、侵权边界到确权实操&#xff0c;结合最新司法实践提炼核心要点&#xff1a; 一、版权归属核心逻辑&#xff1a;人类智力投入的可视化 当用户深度参与创作过程时&#xff0c;可主张版权。关键看操作…

4.2 机器学习 - 欠拟合和过拟合

模型训练的核心挑战是让模型既 “学好” 训练数据&#xff0c;又能 “适应” 新数据。欠拟合&#xff08;Underfitting&#xff09;和过拟合&#xff08;Overfitting&#xff09;是阻碍这一目标的两大典型问题&#xff0c;其本质是 “模型复杂度” 与 “数据复杂度” 不匹配。本…

LeetCode 468. 验证IP地址 - 详细解析

文章目录LeetCode 468. 验证IP地址 - 详细解析题目描述IPv4验证规则&#xff1a;IPv6验证规则&#xff1a;最优Java解决方案&#xff08;注释完整版&#xff09;关键变量含义及代码技巧代码技巧详解1. 前导零检查的最佳实践2. IPv6为什么不能用Character.isDigit()3. 针对性注释…

新能源研发,用新型实验记录本:ELN

新能源&#xff08;材料&#xff09;研发如火如荼&#xff0c;竞争激烈。以电池为例&#xff0c;新能源汽车的崛起、储能技术的突破&#xff0c;让电池成为了能源领域的“新宠”。电池研发已经成为热门赛场&#xff0c;各研发团队都在与时间赛跑&#xff0c;试图维持优势或弯道…

大语言模型领域最新进展

CSDN大礼包《人工智能大模型课程》 CSDN大礼包《人工智能平台设计开发课程课程》

【网安干货】--计算机网络知识梳理总结(二)

这是计算机网络知识梳理的第二篇&#xff0c;真正去梳理才发现内容好多好多好多好多好多啊…怕是预计要写四篇 注意&#xff1a;如果看不清可以右键复制图片链接到浏览器访问或另存为照片并放大查看 计算机网络2 计算机网络协议2.1 网络协议的定义与核心要素2.1.1 协议的定义2.…

百度前端社招面经二

社招 百度 前端开发 二面 base 北京 react 17 和 18 的差异react的响应式原理&#xff0c;js是如何驱动模块的webpacke 4 和 5 差异webpacke 热更新原理。Tree Shaking 是干嘛的import 和 require 区别&#xff0c;都会被Tree Shaking吗隐藏元素的几种方式三栏布局&#xff0c;…

结合prompt分析NodeRAG的build过程

之前介绍了NodeRAG的节点类型和安装过程。 linux环境conda安装NodeRAG示例-CSDN博客 这里尝试从prompt代码角度分析NodeRAG如何将文档转化为节点、关系。 1 整体处理流程 NodeRAG定义了如下所示状态及处理流程。 # define the state to pipeline mapping self.state_pipelin…

我改写的二分法XML转CSV文件程序速度追上了张泽鹏先生的

以下是美团龙猫初稿&#xff0c;我改正&#xff0c;DeepSeek重新格式化的代码。 重要改正点&#xff1a; 1.二分查找用goto控制迭代&#xff0c;返回<row的正确位置 2.在缓冲区头填上父标签使expat能连续解析不报错 #include <stdio.h> #include <stdlib.h> #in…

使用Docker安装Stirling-PDF(PDF工具)

1、官方Web端 详见&#xff1a;https://stirlingpdf.io/?langzh_CN 2、安装Docker 合集&#xff1a;Docker安装与使用 3、安装Stirling-PDF 详见&#xff1a; https://docs.stirlingpdf.com/Installation/Docker%20Install https://hub.docker.com/r/stirlingtools/stirli…

【开题答辩全过程】以 基于微信小程序的“XIN”学生组织管理系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…