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

Riverpod3 注解方式写api 请求的provider在其他地方调用方式

在 View (UI 页面) 中的使用方式

在 UI 中,你可以直接使用 ref.watch 拿到的 AsyncValue。AsyncValue 提供了强大的 .when() 模式匹配,让你非常优雅地处理 Loading、Error 和 Data 状态。

class DeviceDetailView extends ConsumerWidget {final String deviceId;const DeviceDetailView({super.key, required this.deviceId});@overrideWidget build(BuildContext context, WidgetRef ref) {// 1. 获取异步状态 AsyncValue<DeviceItemModel>final deviceDetailAsync = ref.watch(deviceDetailProvider(deviceId));// 2. 获取 Notifier 实例(用来调用 updateName、refresh 等逻辑方法)final notifier = ref.read(deviceDetailProvider(deviceId).notifier);return Scaffold(// 3. 使用 .when 响应不同加载阶段body: deviceDetailAsync.when(// 数据加载成功data: (device) => Column(children: [Text('设备名称: ${device.deviceName}'),Text('在线状态: ${device.isOnline ? '在线' : '离线'}'),ElevatedButton(onPressed: () => notifier.updateName('新设备名字'),child: const Text('修改名称'),),],),// 正在加载中(骨架屏/转圈)loading: () => const Center(child: CircularProgressIndicator()),// 加载报错error: (err, stack) => Center(child: Text('加载失败: $err'),),),);}
}

在其他 Provider 中的使用方式

在其他的 Notifier 或 Provider 内部使用时,主要分为 3 种典型场景:

场景 A:只想“监听”数据变化并同步(最常用)

如果你在另一个 Provider 中需要感知 api 的变更(例如设备名字变了,设置页也要跟着刷新); 当前方式不会阻塞UI渲染

@riverpod
class Setting extends _$Setting {@overrideSettingState build(String deviceId) {// ref.watch 返回的是 AsyncValue<DeviceItemModel>final deviceDetailAsync = ref.watch(deviceDetailProvider(deviceId));// 使用 .valueOrNull 从包装盒中提出最新的数据实体final device = deviceDetailAsync.valueOrNull;return SettingState(deviceName: device?.deviceName ?? '默认名称',isOnline: device?.isOnline ?? false,);}
}

场景 B:异步链式依赖(等待它彻底加载完成后再做下一步)

如果你在当前 Provider 中需要严格等待 DeviceDetail 从网络/接口加载出来,再发起自己的请求:

@riverpod
Future<List<CameraStream>> cameraStreams(Ref ref, String deviceId) async {// 🌟 使用 .future!它会返回真正的 Future<DeviceItemModel>// 会一直 await 阻塞直到 DeviceDetail 的 build() 真正返回成功数据final device = await ref.watch(deviceDetailProvider(deviceId).future);// 拿到真正的 device 实体后,再发起属于自己的请求final streams = await fetchStreamsBySn(device.snNumber);return streams;
}

场景 C:在某个 Action(方法/按钮点击)中临时触发读取

如果不是在 build 阶段,而是在某个点击方法内部去主动触发或读取最新的设备数据

@riverpod
class ActionController extends _$ActionController {@overridevoid build() {}Future<void> handleSomeClick(String deviceId) async {// 方式 1:如果确定只需要当前内存里已有的值final currentDevice = ref.read(deviceDetailProvider(deviceId)).valueOrNull;// 方式 2:如果不确定数据是否已加载完成,想确保拿到最新的(未完成就等待请求完成)final latestDevice = await ref.read(deviceDetailProvider(deviceId).future);// 方式 3:直接调用 DeviceDetail 的方法(如刷新)await ref.read(deviceDetailProvider(deviceId).notifier).refresh();}
}
http://www.jsqmd.com/news/1249226/

相关文章:

  • 单网口电脑安装openwrt软路由做单臂路由
  • 【计算机毕业设计案例】基于 Django 的鲜花礼品个性化定制系统 花卉商品运维与销售数据统计系统(程序+文档+讲解+定制)
  • openwrt软路由实现ipv6上网配置
  • AI赋能知识付费:技术应用与商业变现全解析
  • esxi不识别硬盘_ESXI安装OpenWRT amp; LEDE软路由部署指南(附镜像下载)
  • 小程序商城平台哪家强?2026功能、售后与性价比对比
  • vm虚拟机安装lede旁路由_Vmware虚拟机安装LEDE实现软路由openwrt
  • OpenWrt 软路由介绍
  • xss-labs搭建及通关攻略
  • 桥梁桥墩施工质量检测数据集VOC+YOLO格式876张2类别
  • Git Stash 与本地 Commit 有什么区别?
  • ARM Cortex-M4F异常屏蔽与双栈机制:FAULTMASK、BASEPRI、CONTROL寄存器实战解析
  • ChatGPT重大改版!Work与Codex模式区别,90%的人都用错了
  • 两台linux 服务器同步修改的文件
  • Github项目分享——免费的编程中文书籍索引
  • 7.3 工具类型与能力框架《AI智能体应用开发》
  • 2026 杭州奢侈品回收探店实测,避坑干货 + 正规门店全汇总 - 奢侈品回收机构参考
  • B+Tree深度剖析: 高度为3的B+Tree能存多少条MySQL数据?(含计算过程)
  • CNN-Mamba-UNet融合架构在医学图像分割中的创新应用
  • 2026潍坊不锈钢风机厂家哪家好,大尺寸风机厂家推荐怎么选?源头厂家推荐与实用选购指南 - mobible
  • 文件归档统一管理软件的选型困境:功能越全,落地越难
  • DailyTech-20260722
  • MCP与Skill技术:AI任务执行的革命性突破
  • 数据库设计:从单机到分布式
  • 2026在线考试平台搭建服务商前十到底有谁在啊?
  • 【2027最新】基于SpringBoot+Vue的协同过滤电影推荐系统管理系统源码+MyBatis+MySQL
  • 大厂HR面被问拿到国内其他 Offer?用竞品梯队比较话术得体回应「蒸汽求职分享」
  • 同城O2O系统开发实践:本地生活服务如何提升匹配、调度与履约效率
  • 麒麟信安“一云多芯”信创云桌面解决方案入围2020年信息技术应用创新解决方案典型案例名单
  • 迪奥包包回收2026年保定须知 毓典寄卖行本地奢侈品回收门店 - 毓典寄卖行