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

riverpod最基本例子:在一个组件里更新状态,在另一个组件里获取更新的数据

下面是一个完整的例子,演示如何在 Riverpod 中:

  1. 在一个组件(WidgetA)中更新状态
  2. 在另一个组件(WidgetB)中获取更新后的状态

我们将使用 riverpod + flutter_riverpod,并基于最新的 Riverpod 2.0 语法(推荐使用代码生成 @riverpod)。


1. 定义 Provider

首先,创建一个状态管理 Provider(使用 @riverpod 代码生成)。

counter_provider.dart
import 'package:riverpod_annotation/riverpod_annotation.dart';part 'counter_provider.g.dart';// 定义一个 Counter 状态管理类

class Counter extends _$Counter {// 初始状态int build() => 0;// 更新状态的方法void increment() => state++;
}

运行代码生成:

dart run build_runner watch

这会生成 counter_provider.g.dart,包含一个全局可用的 counterProvider


2. 在 WidgetA 中更新状态

创建一个按钮组件,点击时调用 increment() 更新状态。

widget_a.dart
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'counter_provider.dart';class WidgetA extends ConsumerWidget {const WidgetA({super.key});Widget build(BuildContext context, WidgetRef ref) {return ElevatedButton(onPressed: () {// 通过 ref 读取 Counter 并调用方法更新状态ref.read(counterProvider.notifier).increment();},child: const Text('Increment Counter'),);}
}

3. 在 WidgetB 中获取状态

另一个组件监听 counterProvider 的状态变化,并实时显示最新值。

widget_b.dart
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'counter_provider.dart';class WidgetB extends ConsumerWidget {const WidgetB({super.key});Widget build(BuildContext context, WidgetRef ref) {// 监听 counterProvider 的状态变化final counter = ref.watch(counterProvider);return Text('Current Count: $counter',style: Theme.of(context).textTheme.headlineMedium,);}
}

4. 整合到主页面

将两个组件放在同一个页面中测试。

main.dart
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'widget_a.dart';
import 'widget_b.dart';void main() {runApp(const ProviderScope(child: MyApp()));
}class MyApp extends StatelessWidget {const MyApp({super.key});Widget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: const Text('Riverpod Example')),body: const Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [WidgetB(), // 显示状态SizedBox(height: 20),WidgetA(), // 更新状态],),),),);}
}

效果

  • 点击 WidgetA 的按钮时,Counter 状态会递增。
  • WidgetB 会自动刷新并显示最新的计数器值。

关键点说明

  1. ref.read() vs ref.watch()

    • ref.read():一次性读取状态(适合触发方法,如按钮点击)。
    • ref.watch():监听状态变化并自动重建组件(适合显示数据)。
  2. .notifier

    • 通过 ref.read(counterProvider.notifier) 获取 Counter 实例,才能调用其方法(如 increment())。
  3. ProviderScope

    • 必须在应用的根节点包裹 ProviderScope,这是 Riverpod 的核心上下文。

通过这个例子,你可以清晰看到 Riverpod 的状态更新跨组件共享状态的流程。

http://www.xdnf.cn/news/13770.html

相关文章:

  • 龙虎榜——20250612
  • JavaScript原型,原型链。
  • Elasticsearch 的自动补全以及RestAPI的使用
  • Arduino入门教程:1-1、先跑起来(点亮LED打印Helloworld)
  • `setVisible(false)` 隐藏菜单不生效的分析思路
  • Java Solon v3.3.2 发布(可替换,美国博通公司的 Spring 方案)
  • 轻松聊测试报告
  • Vue3学习(6)-Vue3的生命周期和自定义hook
  • 浅谈软件开发工作流
  • 论文参考文献干干货
  • Null-text Inversion for Editing Real Images using Guided Diffusion Models
  • ChatGPT革命升级!o3-pro模型重磅发布:开启AI推理新纪元
  • 人工智能应用案例:如何处理数据、分析数据并训练模型迭代至满意程度
  • Conan 包管理工具介绍与使用
  • 下载量飙升153.6%,《Solvely》如何成为出海AI教育应用新晋“黑马“?
  • Windows下安装MySQL5.7安装过程
  • Verilog基础:$timeformat系统任务的使用
  • Linux服务器部署n8n实战教程
  • AWS-EFS
  • 智能安全带:建筑行业安全防护的新利器
  • 黑群晖NAS部署DeepSeek模型与内网穿透实现本地AI服务
  • Linux中升级或者切换python版本
  • 网络上搜集的IFC资源共享(含下载链接)
  • LLM基础7_用于文本分类的微调
  • Cesium1.95中加载模型过多导致内存溢出的解决方案
  • 用户态与内核态是什么?有什么作用?两者在什么时候切换?为什么要切换?
  • 知识变现新趋势:创客匠人解析创始人 IP 打造与行业破局之道
  • SmartGit(图形化GitGUI客户端) v24.1.3
  • Python实现web请求与访问
  • 选品融电商:全域代运营赋能,抖音小红书销量倍增的头部引擎