我认为 ref.listen 比 ref.watch 更适合用于 doreset 函数。
与 ref.watch 类似,ref.listen 可用于监听提供者。
它们之间的主要区别在于,如果侦听提供程序发生变化,使用 ref.listen 将调用自定义函数,而不是重新构建小部件/提供程序。
根据 Riverpod 文档
ref.listen 方法有两个位置参数,第一个是Provider,第二个是我们想要在状态变化时执行的回调函数。
回调函数调用时,会传入两个值,前一个State的值和新State的值。
&
如您所见,在小部件中侦听 FutureProvider 会返回一个 AsyncValue – 它允许处理错误/加载状态。
在实践中
doreset 函数
我选择只处理数据情况下的 AsyncValue。
final doReset = Provider(
(ref) {
final done = ref.listen<AsyncValue>(doneProvider, (previousState, state) {
state.whenData((value) {
if (value) {ref.read(randomAdderProvider.notifier).reset();}
});
});
},
);
不要忘记在 Home Widget 的 build 方法中检查 doReset/doneProvider。否则,两者都不会启动(对此行为没有解释)
class Home extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
ref.watch(doReset);
...
最后,你的随机函数永远不会满足你设置为 delay>4 的条件,因为最大可能的延迟是 4。尝试使用 delay>3 或 delay=4。
该按钮也可能被禁用以防止在等待更新时点击
© 版权声明
本站下载的源码均来自公开网络收集转发二次开发而来,
若侵犯了您的合法权益,请来信通知我们1413333033@qq.com,
我们会及时删除,给您带来的不便,我们深表歉意。
下载用户仅供学习交流,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担,访问及下载者下载默认同意本站声明的免责申明,请合理使用切勿商用。
THE END
暂无评论内容