【问题标题】:Riverpod: How to read provider after async gapRiverpod:如何在异步间隙后读取提供程序
【发布时间】:2022-09-23 19:31:51
【问题描述】:

我正在尝试构建一个简单的登录屏幕。为此,我设置了一个StateProvider 来指示是否显示加载指示器:

final loginIsLoadingProvider = StateProvider<bool>((ref) => false);

当按下按钮时,我调用以下函数:

void logInUser(WidgetRef ref) async {
    ref.read(loginIsLoadingProvider.notifier).state = true;
    await Future.delayed(1.seconds); //login logic etc.
    ref.read(loginIsLoadingProvider.notifier).state = false; //Exception
return;

但是在等待未来之后调用ref.read(...) 会引发以下异常:

FlutterError(查找已停用的小部件的祖先是不安全的。此时小部件的元素树的状态不再稳定。要在其 dispose() 方法中安全地引用小部件的祖先,请保存通过在小部件的 didChangeDependencies() 方法中调用dependOnInheritedWidgetOfExactType() 对祖先的引用。)

为什么我不能在异步间隙后调用ref.read()?有没有办法做到这一点?

  • 我发现在脚手架上添加scaffoldKey = GlobalKey&lt;ScaffoldState&gt;(); 可以解决这个问题,但我觉得这应该没有必要......

标签: flutter riverpod


【解决方案1】:

一个解决方案是阅读您的供应商异步间隙,但不要立即使用它们。

例如:

Future<void> logInUser(WidgetRef ref) async {
  final isLoadingNotifier = ref.read(loginIsLoadingProvider.notifier);
  isLoadingNotifier.state = true;

  await someAsyncOperation();

  isLoadingNotifier.state = false;
}

【讨论】:

    猜你喜欢
    • 2021-05-30
    • 2021-10-13
    • 1970-01-01
    • 2021-02-25
    • 2021-10-27
    • 2021-01-19
    • 2022-11-11
    • 2021-11-29
    • 2022-10-24
    相关资源
    最近更新 更多