flutter - Flutter Riverpod:StreamProvider/FutureProvider 组合的重建太多
问题描述
使用flutter_riverpod
,给定以下提供者:
final s = StreamProvider.autoDispose<bool>((ref) async* {
yield true;
});
final f = FutureProvider.autoDispose<bool>((ref) async {
final source = await ref.watch(s.last);
print('Stream value received: $source');
return source;
});
当f
从 a 引用时Widget
,它会打印两次消息,即它会重建两次,即使被引用StreamProvider
的流只发出一个值。
Stream value received: true
Stream value received: true
这是为什么?如何确保FutureProvider
每个发出的流值只运行一次?
这是重现该问题的完整最小代码:
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
final s = StreamProvider.autoDispose<bool>((ref) async* {
yield true;
});
final f = FutureProvider.autoDispose<bool>((ref) async {
final source = await ref.watch(s.last);
print('Stream value received: $source');
return source;
});
void main() {
runApp(ProviderScope(child: (MyApp())));
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.light(),
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Center(
child: MyWidget(),
),
),
);
}
}
class MyWidget extends ConsumerWidget {
@override
Widget build(BuildContext context, ScopedReader watch) {
watch(f);
return const Text('hi');
}
}
解决方案
推荐阅读
- c - 在 C 中运行客户端和服务器套接字连接 - 使用线程
- javascript - 在嵌套数组的特定索引中定位键值对的两个实例
- ios - 如何从 node.js 网络服务中获取数据并在 iOS 应用程序中显示?
- xpath - XML 转换根据相邻节点中的值定位节点
- rust - 如何在异步函数中设置断点?
- java - 检查字符串中两个元素之间是否有空格
- angular - 角度反应形式 - 当用户将 UI 更改恢复为原始值时,原始值是否会重置?
- c# - 在 Xamarin BindingBase.EnableCollectionSynchronization 不起作用
- asp.net-mvc - 使用修改后的 JsonValueProviderFactory 解决 maxJsonLength 异常后更改了原始数据
- reactjs - 如何将客户表antd formatNumber