-
Notifications
You must be signed in to change notification settings - Fork 139
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Looking up a deactivated widget's ancestor is unsafe. #189
Comments
The specified entry is already present in the target Overlay.
The OverlayEntry was:
SmartOverlayEntry#d7032(opaque: false; maintainState: false)
The Overlay the OverlayEntry was trying to insert to was:
OverlayState#e45c5(lifecycle state: defunct, not mounted, entries: [OverlayEntry#a8309(opaque: false; maintainState: false)])
Consider calling remove on the OverlayEntry before inserting it to a different Overlay, or switching to the OverlayPortal API to avoid manual OverlayEntry management.
Stack Trace:
#0 OverlayState._debugCanInsertEntry (package:flutter/src/widgets/overlay.dart:631:7)
#1 OverlayState.insert (package:flutter/src/widgets/overlay.dart:669:12)
#2 CustomToast.showToast.showToast (package:flutter_smart_dialog/src/custom/toast/custom_toast.dart:46:41)
#3 CustomToast.normalToast (package:flutter_smart_dialog/src/custom/toast/custom_toast.dart:128:25)
#4 ToastTool.dispatchNext (package:flutter_smart_dialog/src/custom/toast/toast_tool.dart:80:25)
#5 CustomToast.normalToast.<anonymous closure> (package:flutter_smart_dialog/src/custom/toast/custom_toast.dart:131:26)
<asynchronous suspension> |
dependencies:
flutter_smart_dialog: ^4.9.7+1 |
介系船新版本的报错 I/flutter (25749): Bad state: Future already completed
I/flutter (25749): #0 _AsyncCompleter.complete (dart:async/future_impl.dart:43:31)
I/flutter (25749): #1 DialogProxy.beforeShow (package:flutter_smart_dialog/src/helper/dialog_proxy.dart:371:20)
I/flutter (25749): <asynchronous suspension>
I/flutter (25749): #2 DialogProxy.showLoading (package:flutter_smart_dialog/src/helper/dialog_proxy.dart:296:5)
I/flutter (25749): <asynchronous suspension>
I/flutter (25749): 'package:flutter/src/widgets/overlay.dart': Failed assertion: line 207 pos 12: '_overlay != null': is not true.
I/flutter (25749): #0 _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:51:61)
I/flutter (25749): #1 _AssertionError._throwNew (dart:core-patch/errors_patch.dart:40:5)
I/flutter (25749): #2 OverlayEntry.remove (package:flutter/src/widgets/overlay.dart:207:12)
I/flutter (25749): #3 SmartOverlayEntry.remove (package:flutter_smart_dialog/src/widget/helper/smart_overlay_entry.dart:21:11)
I/flutter (25749): #4 _SmartOverlayState.initState.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:flutter_smart_dialog/src/widget/helper/smart_overlay.dart:52:46)
I/flutter (25749): #5 State.setState (package:flutter/src/widgets/framework.dart:1203:30)
I/flutter (25749): #6 _SmartOverlayState.initState.<anonymous closure>.<anonymous closure> (package:flutter_smart_dialog/src/widget/helper/smart_overlay.dart:42:9)
I/flutter (25749): #7 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1392:15)
I/flutter (25749): #8 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1326:11)
I/flutter (25749): #9 SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:117
I/flutter (25749): 'package:flutter/src/widgets/overlay.dart': Failed assertion: line 207 pos 12: '_overlay != null': is not true.
I/flutter (25749): #0 _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:51:61)
I/flutter (25749): #1 _AssertionError._throwNew (dart:core-patch/errors_patch.dart:40:5)
I/flutter (25749): #2 OverlayEntry.remove (package:flutter/src/widgets/overlay.dart:207:12)
I/flutter (25749): #3 SmartOverlayEntry.remove (package:flutter_smart_dialog/src/widget/helper/smart_overlay_entry.dart:21:11)
I/flutter (25749): #4 _SmartOverlayState.initState.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:flutter_smart_dialog/src/widget/helper/smart_overlay.dart:52:46)
I/flutter (25749): #5 State.setState (package:flutter/src/widgets/framework.dart:1203:30)
I/flutter (25749): #6 _SmartOverlayState.initState.<anonymous closure>.<anonymous closure> (package:flutter_smart_dialog/src/widget/helper/smart_overlay.dart:42:9)
I/flutter (25749): #7 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1392:15)
I/flutter (25749): #8 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1326:11)
I/flutter (25749): #9 SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:117
I/flutter (25749): Bad state: Future already completed
I/flutter (25749): #0 _AsyncCompleter.complete (dart:async/future_impl.dart:43:31)
I/flutter (25749): #1 DialogProxy.beforeShow (package:flutter_smart_dialog/src/helper/dialog_proxy.dart:371:20)
I/flutter (25749): <asynchronous suspension>
I/flutter (25749): #2 DialogProxy.show (package:flutter_smart_dialog/src/helper/dialog_proxy.dart:130:5)
I/flutter (25749): <asynchronous suspension>
I/flutter (25749): 'package:flutter/src/widgets/overlay.dart': Failed assertion: line 207 pos 12: '_overlay != null': is not true.
I/flutter (25749): #0 _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:51:61)
I/flutter (25749): #1 _AssertionError._throwNew (dart:core-patch/errors_patch.dart:40:5)
I/flutter (25749): #2 OverlayEntry.remove (package:flutter/src/widgets/overlay.dart:207:12)
I/flutter (25749): #3 SmartOverlayEntry.remove (package:flutter_smart_dialog/src/widget/helper/smart_overlay_entry.dart:21:11)
I/flutter (25749): #4 _SmartOverlayState.initState.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:flutter_smart_dialog/src/widget/helper/smart_overlay.dart:52:46)
I/flutter (25749): #5 State.setState (package:flutter/src/widgets/framework.dart:1203:30)
I/flutter (25749): #6 _SmartOverlayState.initState.<anonymous closure>.<anonymous closure> (package:flutter_smart_dialog/src/widget/helper/smart_overlay.dart:42:9)
I/flutter (25749): #7 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1392:15)
I/flutter (25749): #8 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1326:11)
I/flutter (25749): #9 SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:117 |
dependencies:
flutter_smart_dialog: ^4.9.7+2 |
现在future的问题没有了 I/flutter (29519): 'package:flutter/src/widgets/overlay.dart': Failed assertion: line 207 pos 12: '_overlay != null': is not true.
I/flutter (29519): #0 _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:51:61)
I/flutter (29519): #1 _AssertionError._throwNew (dart:core-patch/errors_patch.dart:40:5)
I/flutter (29519): #2 OverlayEntry.remove (package:flutter/src/widgets/overlay.dart:207:12)
I/flutter (29519): #3 SmartOverlayEntry.remove (package:flutter_smart_dialog/src/widget/helper/smart_overlay_entry.dart:21:11)
I/flutter (29519): #4 _SmartOverlayState.initState.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:flutter_smart_dialog/src/widget/helper/smart_overlay.dart:52:46)
I/flutter (29519): #5 State.setState (package:flutter/src/widgets/framework.dart:1203:30)
I/flutter (29519): #6 _SmartOverlayState.initState.<anonymous closure>.<anonymous closure> (package:flutter_smart_dialog/src/widget/helper/smart_overlay.dart:42:9)
I/flutter (29519): #7 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1392:15)
I/flutter (29519): #8 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1326:11)
I/flutter (29519): #9 SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:117
I/flutter (29519): 'package:flutter/src/widgets/overlay.dart': Failed assertion: line 207 pos 12: '_overlay != null': is not true.
I/flutter (29519): #0 _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:51:61)
I/flutter (29519): #1 _AssertionError._throwNew (dart:core-patch/errors_patch.dart:40:5)
I/flutter (29519): #2 OverlayEntry.remove (package:flutter/src/widgets/overlay.dart:207:12)
I/flutter (29519): #3 SmartOverlayEntry.remove (package:flutter_smart_dialog/src/widget/helper/smart_overlay_entry.dart:21:11)
I/flutter (29519): #4 _SmartOverlayState.initState.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:flutter_smart_dialog/src/widget/helper/smart_overlay.dart:52:46)
I/flutter (29519): #5 State.setState (package:flutter/src/widgets/framework.dart:1203:30)
I/flutter (29519): #6 _SmartOverlayState.initState.<anonymous closure>.<anonymous closure> (package:flutter_smart_dialog/src/widget/helper/smart_overlay.dart:42:9)
I/flutter (29519): #7 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1392:15)
I/flutter (29519): #8 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1326:11)
I/flutter (29519): #9 SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:117
|
怎么复现的? 给个demo我试试 |
在项目里面测出来的,一时半会感觉剥不出来,要不然我用master先测,测好了再发? |
把版本降回4.9.6后没有问题 |
4.9.7初始化做了重构, 解决以前难以解决的问题, 你那边在4.9.7发生的问题, 可以新建个项目, 然后给下最简可运行可复现问题的代码, 我这边复现后才好尝试解决 4.9.7的初始化重构是有一定意义的, 在调试场景和相关性能都有相关提升 |
现在已经定位到问题,是用的loading dialog出了问题,我把我自定义的loading dialog代码如下 /// 在接口请求前后加上loading
class LoadingInterceptor extends InterceptorsWrapper {
/// 请求的队列,用于保证当前只有一个loading弹窗在界面上展示
final List<String> _loadingRequests = <String>[];
/// 展示弹窗
Future<void> _showLoading(String tag) async {
return SmartDialog.showLoading(
clickMaskDismiss: false,
backDismiss: false,
maskColor: Colors.black12,
builder: (_) => const LoadingDialog(),
);
}
/// 取消弹窗
Future<void> _dismissLoading([String? tag]) async {
if (tag != null) {
// 先移除队列中当前的接口
_loadingRequests.remove(tag);
}
return SmartDialog.dismiss<void>(status: SmartStatus.loading, tag: tag);
}
/// 展示loading的处理
void _handleShow(
RequestOptions requestOptions,
Map<String, dynamic> extra,
) {
final bool? shouldLoading = extra[JunnyConstants.requestLoading] as bool?;
if (shouldLoading ?? true) {
final String uri = requestOptions.uri.normalizePath().toString();
_loadingRequests.add(uri);
// 如果队列中还有正在请求的接口而且当前loading弹窗正在展示
// 那么在队列中等待展示
if (SmartDialog.config.checkExist(
dialogTypes: const <SmartAllDialogType>{SmartAllDialogType.loading},
)) {
return;
}
_showLoading(uri);
}
}
/// 取消loading的处理
Future<void> _handleDismiss(
RequestOptions requestOptions,
Map<String, dynamic> extra,
) async {
final bool? shouldLoading = extra[JunnyConstants.requestLoading] as bool?;
final String uri = requestOptions.uri.normalizePath().toString();
// 取消当前接口弹窗ui展示
await _dismissLoading(uri);
// 如果请求队列中还有数据
if (_loadingRequests.isNotEmpty) {
if (shouldLoading ?? true) {
// 继续展示最后一个加入的接口
_showLoading(_loadingRequests.last);
}
} else {
// 此行是为了解决已经dismiss掉所有loading
// 且界面上没有loading dialog显示的情况下isExist仍然为true的情况
await _dismissLoading();
}
}
@override
Future<void> onRequest(
RequestOptions options,
RequestInterceptorHandler handler,
) async {
final Map<String, dynamic> extra = options.extra;
_handleShow(options, extra);
handler.next(options);
}
@override
Future<void> onResponse(
Response<dynamic> response,
ResponseInterceptorHandler handler,
) async {
handler.next(response);
final RequestOptions requestOptions = response.requestOptions;
final Map<String, dynamic> extra = requestOptions.extra;
_handleDismiss(requestOptions, extra);
}
@override
Future<void> onError(
DioException err,
ErrorInterceptorHandler handler,
) async {
handler.next(err);
final RequestOptions requestOptions = err.requestOptions;
final Map<String, dynamic> extra = requestOptions.extra;
_handleDismiss(requestOptions, extra);
}
}
|
没太看懂你的例子, 你的意思是dismiss完loading后, 然后你又dismiss了loading, 就出了问题? |
这个interceptor的作用是 请求开始时: 请求完成时: 并发请求管理: 现在我不清楚这个逻辑哪里出的问题,因为我把这个拦截器取消之后报错就没有了, 有尝试抽取一个demo,但是并不能复现 |
dependencies:
flutter_smart_dialog: ^4.9.7+3 |
还是不行,可能是这个拦截器里面用法有问题,我再试试吧 |
this works for me. there is no error after i did this in my code |
dependencies:
flutter_smart_dialog: ^4.9.7+7 |
Still reproducible using |
我遇到这个问题的原因是:注册了多次(FlutterSmartDialog.init()),只初始化一次解决了这个问题,希望它对排查有一定帮助 |
版本信息
描述bug/需求
暂未发现如何复现,且出现如下异常后无法显示toast
问题demo
The text was updated successfully, but these errors were encountered: