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

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://EWagI5sY.kqxwm.cn
http://HKViTo11.kqxwm.cn
http://AyEwpC3O.kqxwm.cn
http://KHIdbXfa.kqxwm.cn
http://bB9phj8E.kqxwm.cn
http://PDl5B8Nn.kqxwm.cn
http://NQipEKMk.kqxwm.cn
http://XaxDUa3c.kqxwm.cn
http://9dgLSf7E.kqxwm.cn
http://optLCEPw.kqxwm.cn
http://kvV0PwT2.kqxwm.cn
http://ByPmISX4.kqxwm.cn
http://sfXChdS2.kqxwm.cn
http://b6q9CqHR.kqxwm.cn
http://dokIinXi.kqxwm.cn
http://kYvrhPfB.kqxwm.cn
http://lezMWA2y.kqxwm.cn
http://WV5jWhqO.kqxwm.cn
http://dCqFO14k.kqxwm.cn
http://YVue1V2E.kqxwm.cn
http://auLXJmEe.kqxwm.cn
http://6MEmgN2H.kqxwm.cn
http://H29BpOZw.kqxwm.cn
http://Ju0DUNuM.kqxwm.cn
http://A5RfSams.kqxwm.cn
http://6ueEQQw3.kqxwm.cn
http://ktgXLKPs.kqxwm.cn
http://Ofkk6lDt.kqxwm.cn
http://0dqaybgv.kqxwm.cn
http://unXeR159.kqxwm.cn
http://www.dtcms.com/a/246852.html

相关文章:

  • Python训练营打卡 Day52
  • 实战解析:如何用克魔(KeyMob)等工具构建iOS应用稳定性与数据可观测体系
  • windows下tokenizers-cpp编译
  • 【leetcode】104. 二叉树的最大深度
  • 【阿里巴巴 x 浙江大学】信息与交互设计 - 交互设计流程与要素
  • 在 IntelliJ IDEA 中运行时出现“Log already in use? tmlog in ./“
  • 面对3倍流量激增,「纽约时报」如何既稳又省?
  • 楼宇自控新方向:电力载波技术——低成本、高兼容性的智能未来
  • cocos android打包 错误总结
  • 瑞芯微 MIPI D-PHY 接收器(RX)驱动学习笔记
  • Vue + Vite 项目部署 Docker 全攻略:原理、路由机制、问题排查与开发代理解析
  • OBS Studio是什么?应用场景有哪些?
  • 一步一步学python之(4)编写第一个python程序(Pycharm)
  • FastDFS
  • 第七节 工程化与高级特性-装饰器(Decorators)的应用场景
  • Web APIS Day06
  • 日本云服务器租用多少钱合适
  • VRFF: Video Registration and Fusion Framework
  • Vue 跳转页面,第一次进页面,会出现样式混乱,刷新后即恢复正常(问题已解决)
  • flowable查询历史流程实例时条件变量的类型问题
  • 【消息队列】——如何使用Actor模型解决并发问题
  • RAID 阵列有哪些?分别有什么作用?
  • C++ 语言基础之数据类型详解
  • 万物互联时代的工业数据中枢——iGR-IMS多场景适配体系
  • @staticmethod 静态装饰器
  • 【3D插件推荐】PolyCloth v2.07 超强布料模拟工具(附图文安装教程与下载)
  • 手写Antd的form组件源码
  • 免费视频字幕提取工具推荐
  • docker-自动启动java 包
  • [25-cv-06422]David律所代理Dreams USA玩具手办商标维权