当一个人点击网页上的返回按钮时,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怎么表达