gpt4 book ai didi

flutter - 当用户点击网页上的后退按钮时,Riverpod 会出现错误状态异常

转载 作者:行者123 更新时间:2023-12-04 14:58:01 25 4
gpt4 key购买 nike

当我点击他们网页上的后退按钮时,我在 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 (e) {
if (e.runtimeType.toString() == 'StateError') {
// ignore the error
} else {
state = AsyncError(e);
}
}

最佳答案

我相信你可以通过查看 mounted 来解决这个问题。在 API 调用之后设置状态之前,如下所示:

List<Run> stuff = await read(apiProvider).longRunningAPI(param: param);
if (!mounted) return;
state = AsyncData(stuff);
这只是检查是否调用了 dispose,如果是,则不要尝试修改状态。
另一个可能有用的资源是添加 cancelToken到您的 API 调用并在提供者被处置时取消。
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 添加到您的实际请求中。 marvel example project 就是一个很好的例子。可以找到 Riverpod 的作者 here .

关于flutter - 当用户点击网页上的后退按钮时,Riverpod 会出现错误状态异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67574001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com