当一个人点击网页上的返回按钮时,Riverpod 给出一个糟糕的状态异常

Posted

技术标签:

【中文标题】当一个人点击网页上的返回按钮时,Riverpod 给出一个糟糕的状态异常【英文标题】:Riverpod giving a bad state exception when one hits back button on webpage 【发布时间】:2021-08-06 23:16:53 【问题描述】:

当我点击他们网页上的后退按钮时,我的 StateNotifiers 中出现此错误。我已将其隔离在longRunningAPI 请求下方的位置。

Exception has occurred.
"Error: Bad state: Tried to use RunListNotifier after `dispose` was called.

我有这样的代码。

final runListController = StateNotifierProvider.autoDispose
    .family<RunListNotifier, AsyncValue<List<Run>>, RunListParameter>(
        (ref, param) 
  return RunListNotifier(read: ref.read, param: param);
);

class RunListNotifier extends StateNotifier<AsyncValue<List<Run>>> 
  RunListNotifier(required this.read, required this.param)
      : super(AsyncLoading()) 
    fetchViaAPI(param);
  

  final Reader read;
  final RunListParameter param;
  void fetchViaAPI(RunListParameter param) async 
    state = AsyncLoading();
    try 
      List<Run> stuff = await read(apiProvider).longRunningAPI(param: param);
      state = AsyncData(stuff);
     catch (e) 
      state = AsyncError(e);
    
  

在 catch 中简单地做这样的事情是否安全?

     catch (e) 
      if (e.runtimeType.toString() == 'StateError') 
         // ignore the error
       else 
         state = AsyncError(e);
      
    

【问题讨论】:

【参考方案1】:

我相信您可以通过在 API 调用之后设置状态之前检查 mounted 来解决此问题,如下所示:

List<Run> stuff = await read(apiProvider).longRunningAPI(param: param);
if (!mounted) return;
state = AsyncData(stuff);

这只是检查是否调用了 dispose,如果是,则不要尝试修改状态。

另一个可能有用的资源是在您的 API 调用中添加 cancelToken,如果提供程序被释放,则取消。

final longRunningApi = FutureProvider.autoDispose.family<List<Run>, RunListParameter>((ref, param) async 
  final cancelToken = CancelToken();
  ref.onDispose(cancelToken.cancel);

  final api = await ref.watch(apiProvider);
  final res = await api.longRunningApi(param, cancelToken);
  
  ref.maintainState = true;
  return res;
);

然后您必须将 cancelToken 添加到您的实际请求中。在 Riverpod 的作者marvel example project 中可以找到一个很好的例子here。

【讨论】:

这非常有帮助。谢谢亚历克斯。

以上是关于当一个人点击网页上的返回按钮时,Riverpod 给出一个糟糕的状态异常的主要内容,如果未能解决你的问题,请参考以下文章

点击网页底部的top按钮直接回到网页顶部,怎么做?用js怎么表达

python点击网页上的按钮

当点击网页上的任何链接或提交按钮时如何在 JavaScript 中检测

dw 做网页时怎么做个带点击特效的按钮

当一个人也有时间时如何比较相等的日期

网页提交,点击浏览器返回按钮,网页出错