如何解决使用颤振中的选项卡项进行提供程序调用处理
我使用相同的提供程序和模型来存储状态,以便我的 api 以不同的订单状态进行订购,因为只有订单状态发生变化,我将它们显示在选项卡栏中的单独屏幕中,并调用提供程序来获取每个选项卡开关上的响应,但是我在使用 dispose 方法时遇到错误,并且在频繁切换时整个选项卡视图中的数据也不一致,有人可以提出解决此问题的正确方法吗?
这是我的标签项代码
OrderMainScreen(token: _token),OrderStatusScreen(
token: _token,orderStatus: "unpaid",),orderStatus: "processing",orderStatus: "delivered",]),
这是我获取订单状态的代码
class OrderStatusScreen extends StatefulWidget {
final String token;
final String orderStatus;
OrderStatusScreen({this.token,this.orderStatus});
_OrderStatusScreenState createState() => _OrderStatusScreenState();
}
class _OrderStatusScreenState extends State<OrderStatusScreen> {
void initState() {
if (mounted) {
Future.delayed(Duration.zero).then((value) {
Provider.of<OrderProvider>(context,listen: false)
.fetchUserOrderStatus(widget.token,status: widget.orderStatus);
});
super.initState();
}
}
频繁切换标签时出现此错误
W/MediaPlayer-JNI(28753): MediaPlayer finalized without being released
E/flutter (28753): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: This widget has been unmounted,so the State no longer has a context (and should be considered defunct).
E/flutter (28753): Consider canceling any active work during "dispose" or using the "mounted" getter to determine if the State is still active.
[38;5;244mE/flutter (28753): #0 State.context.<anonymous closure>[39;49m
[38;5;244mE/flutter (28753): #1 State.context[39;49m
[38;5;248mE/flutter (28753): #2 _OrderStatusScreenState.initState.<anonymous closure>[39;49m
[38;5;244mE/flutter (28753): #3 _rootRunUnary (dart:async/zone.dart:1362:47)[39;49m
[38;5;244mE/flutter (28753): #4 _CustomZone.runUnary (dart:async/zone.dart:1265:19)[39;49m
[38;5;244mE/flutter (28753): #5 _FutureListener.handleValue (dart:async/future_impl.dart:152:18)[39;49m
[38;5;244mE/flutter (28753): #6 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:704:45)[39;49m
[38;5;244mE/flutter (28753): #7 Future._propagateToListeners (dart:async/future_impl.dart:733:32)[39;49m
[38;5;244mE/flutter (28753): #8 Future._complete (dart:async/future_impl.dart:530:7)[39;49m
[38;5;244mE/flutter (28753): #9 new Future.delayed.<anonymous closure> (dart:async/future.dart:312:16)[39;49m
[38;5;244mE/flutter (28753): #10 _rootRun (dart:async/zone.dart:1346:47)[39;49m
[38;5;244mE/flutter (28753): #11 _CustomZone.run (dart:async/zone.dart:1258:19)[39;49m
[38;5;244mE/flutter (28753): #12 _CustomZone.runGuarded (dart:async/zone.dart:1162:7)[39;49m
[38;5;244mE/flutter (28753): #13 _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1202:23)[39;49m
[38;5;244mE/flutter (28753): #14 _rootRun (dart:async/zone.dart:1354:13)[39;49m
[38;5;244mE/flutter (28753): #15 _CustomZone.run (dart:async/zone.dart:1258:19)[39;49m
[38;5;244mE/flutter (28753): #16 _CustomZone.bindCallback.<anonymous closure> (dart:async/zone.dart:1186:23)[39;49m
[38;5;244mE/flutter (28753): #17 Timer._createTimer.<anonymous closure> (dart:async-patch/timer_patch.dart:18:15)[39;49m
[38;5;244mE/flutter (28753): #18 _Timer._runTimers (dart:isolate-patch/timer_impl.dart:395:19)[39;49m
[38;5;244mE/flutter (28753): #19 _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:426:5)[39;49m
[38;5;244mE/flutter (28753): #20 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:184:12)[39;49m
E/flutter (28753):
解决方法
这可能不是答案,但我仍然会指出可能导致您收到此错误的部分。
-
您不必检查
if(mounted)
内的initState
因为 initState 将在构建小部件树时运行,为简单起见,当您导航到此页面时,它将运行initState
先做,剩下的就做。 -
如果您将
Tab bar
与Tab Bar View
一起使用,请参阅此链接 https://flutter.dev/docs/cookbook/design/tabs 以了解如何使用 Flutter 标签栏。 -
如果您所指的
tab items
是 FlutterTab Bar
,那么您必须了解每当您浏览标签栏时,旧的标签视图将被处置,而新的标签您要查看的栏视图将被构建。这可能是您收到此错误的原因。 -
对于每个标签栏视图来说,最好是一个新的有状态小部件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。