Skip to content

Commit c5e31aa

Browse files
committed
fix [#53](#53), fix back event cannot close loading
1 parent 14a4a56 commit c5e31aa

File tree

12 files changed

+75
-27
lines changed

12 files changed

+75
-27
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# [4.0.x]
22

3+
- Fix [#53](https://github.com/fluttercandies/flutter_smart_dialog/issues/53)
4+
- Fix back event cannot close loading
5+
6+
# [4.0.0]
7+
38
- Breaking Change!!! migrate doc: [3.x migrate 4.0](https://github.com/fluttercandies/flutter_smart_dialog/blob/master/docs/3.x%20migrate%204.0.md) | [3.x 迁移 4.0](https://juejin.cn/post/7093867453012246565)
49
- Major update
510
- Subdivided 'config', can control 'show', 'showAttach', 'showLoading', 'showToast' in more detail
@@ -10,6 +15,7 @@
1015
- Loading can set the least loading time
1116
- Add click listener for dialog mask
1217

18+
1319
# [3.4.x]
1420

1521
- 'showToast' add 'consumeEvent' param: [#27](https://github.com/fluttercandies/flutter_smart_dialog/issues/27)

lib/src/custom/custom_dialog.dart

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:flutter_smart_dialog/src/data/dialog_info.dart';
55
import 'package:flutter_smart_dialog/src/data/smart_tag.dart';
66
import 'package:flutter_smart_dialog/src/helper/dialog_proxy.dart';
77
import 'package:flutter_smart_dialog/src/helper/route_record.dart';
8+
import 'package:flutter_smart_dialog/src/util/view_utils.dart';
89
import 'package:flutter_smart_dialog/src/widget/attach_dialog_widget.dart';
910

1011
import '../config/enum_config.dart';
@@ -215,10 +216,12 @@ class CustomDialog extends BaseDialog {
215216
proxy.dialogQueue.addLast(dialogInfo);
216217
}
217218
// insert the dialog carrier into the page
218-
Overlay.of(DialogProxy.contextOverlay)!.insert(
219-
overlayEntry,
220-
below: proxy.entryLoading,
221-
);
219+
ViewUtils.addRouteSafeUse(() {
220+
Overlay.of(DialogProxy.contextOverlay)!.insert(
221+
overlayEntry,
222+
below: proxy.entryLoading,
223+
);
224+
});
222225
}
223226

224227
bool _checkDebounce(bool debounce, DialogType type) {

lib/src/custom/custom_loading.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class CustomLoading extends BaseDialog {
2323
required Color maskColor,
2424
required Widget? maskWidget,
2525
required bool backDismiss,
26-
}) async {
26+
}) {
2727
DialogProxy.instance.loadingBackDismiss = backDismiss;
2828
SmartDialog.config.loading.isExist = true;
2929

lib/src/custom/main_dialog.dart

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
44
import 'package:flutter_smart_dialog/src/data/base_controller.dart';
55
import 'package:flutter_smart_dialog/src/data/smart_tag.dart';
66
import 'package:flutter_smart_dialog/src/helper/dialog_proxy.dart';
7+
import 'package:flutter_smart_dialog/src/util/view_utils.dart';
78
import 'package:flutter_smart_dialog/src/widget/attach_dialog_widget.dart';
89
import 'package:flutter_smart_dialog/src/widget/smart_dialog_widget.dart';
910

@@ -104,23 +105,25 @@ class MainDialog {
104105
required VoidCallback? onDismiss,
105106
required bool useSystem,
106107
}) {
107-
_onDismiss = onDismiss;
108-
109-
if (useSystem && DialogProxy.contextNavigator != null) {
110-
var tempWidget = _widget;
111-
showDialog(
112-
context: DialogProxy.contextNavigator!,
113-
barrierColor: Colors.transparent,
114-
barrierDismissible: false,
115-
useSafeArea: false,
116-
routeSettings: RouteSettings(name: SmartTag.systemDialog),
117-
builder: (BuildContext context) => tempWidget,
118-
);
119-
_widget = Container();
120-
}
121-
122-
//refresh dialog
123-
overlayEntry.markNeedsBuild();
108+
ViewUtils.addRouteSafeUse(() {
109+
_onDismiss = onDismiss;
110+
111+
if (useSystem && DialogProxy.contextNavigator != null) {
112+
var tempWidget = _widget;
113+
_widget = Container();
114+
showDialog(
115+
context: DialogProxy.contextNavigator!,
116+
barrierColor: Colors.transparent,
117+
barrierDismissible: false,
118+
useSafeArea: false,
119+
routeSettings: RouteSettings(name: SmartTag.systemDialog),
120+
builder: (BuildContext context) => tempWidget,
121+
);
122+
}
123+
124+
//refresh dialog
125+
overlayEntry.markNeedsBuild();
126+
});
124127
}
125128

126129
Future<void> dismiss<T>({

lib/src/helper/dialog_proxy.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ class DialogProxy {
188188
required bool debounce,
189189
required SmartToastType displayType,
190190
required Widget widget,
191-
}) async {
191+
}) {
192192
return _toast.showToast(
193193
alignment: alignment,
194194
clickMaskDismiss: clickMaskDismiss,

lib/src/helper/navigator_observer.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import 'package:flutter/material.dart';
2+
import 'package:flutter_smart_dialog/src/config/enum_config.dart';
23
import 'package:flutter_smart_dialog/src/data/smart_tag.dart';
34
import 'package:flutter_smart_dialog/src/helper/route_record.dart';
5+
import 'package:flutter_smart_dialog/src/util/view_utils.dart';
46

57
import '../custom/custom_dialog.dart';
68
import '../smart_dialog.dart';
@@ -12,6 +14,8 @@ class SmartNavigatorObserver extends NavigatorObserver {
1214
DialogProxy.contextNavigator ??= navigator?.context;
1315
RouteRecord.instance.push(route, previousRoute);
1416
RouteRecord.curRoute = route;
17+
18+
ViewUtils.routeSafeUse = false;
1519
}
1620

1721
@override

lib/src/helper/route_record.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'dart:collection';
22

33
import 'package:flutter/material.dart';
4+
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
45
import 'package:flutter_smart_dialog/src/data/smart_tag.dart';
56
import 'package:flutter_smart_dialog/src/helper/dialog_proxy.dart';
67

@@ -33,6 +34,12 @@ class RouteRecord {
3334
bool handleSmartDialog() {
3435
bool shouldHandle = true;
3536
try {
37+
//handle loading
38+
if (SmartDialog.config.isExistLoading) {
39+
return true;
40+
}
41+
42+
//handle dialog
3643
if (DialogProxy.instance.dialogQueue.isEmpty) {
3744
if (routeQueue.isNotEmpty) routeQueue.clear();
3845
shouldHandle = false;

lib/src/init_dialog.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter_smart_dialog/src/helper/navigator_observer.dart';
3+
import 'package:flutter_smart_dialog/src/util/view_utils.dart';
34
import 'package:flutter_smart_dialog/src/widget/toast_widget.dart';
45

56
import 'helper/dialog_proxy.dart';
@@ -71,7 +72,7 @@ class FlutterSmartDialog extends StatefulWidget {
7172
class _FlutterSmartDialogState extends State<FlutterSmartDialog> {
7273
@override
7374
void initState() {
74-
WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {
75+
ViewUtils.addPostFrameCallback((timeStamp) {
7576
try {
7677
var navigator = widget.child as Navigator;
7778
var key = navigator.key as GlobalKey;

lib/src/util/view_utils.dart

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import 'package:flutter/cupertino.dart';
2+
import 'package:flutter/scheduler.dart';
3+
4+
class ViewUtils {
5+
static bool routeSafeUse = false;
6+
7+
static void addRouteSafeUse(VoidCallback callback) async {
8+
if (routeSafeUse) {
9+
callback();
10+
return;
11+
}
12+
13+
ViewUtils.addPostFrameCallback((timeStamp) {
14+
routeSafeUse = true;
15+
callback();
16+
});
17+
}
18+
19+
static void addPostFrameCallback(FrameCallback callback) {
20+
WidgetsBinding.instance?.addPostFrameCallback(callback);
21+
}
22+
}

lib/src/widget/attach_dialog_widget.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'dart:math';
33
import 'package:flutter/material.dart';
44
import 'package:flutter_smart_dialog/src/data/base_controller.dart';
55
import 'package:flutter_smart_dialog/src/data/location.dart';
6+
import 'package:flutter_smart_dialog/src/util/view_utils.dart';
67

78
import '../config/enum_config.dart';
89

@@ -120,7 +121,7 @@ class _AttachDialogWidgetState extends State<AttachDialogWidget>
120121
targetOffset = widget.target!;
121122
targetSize = Size.zero;
122123
}
123-
WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {
124+
ViewUtils.addPostFrameCallback((timeStamp) {
124125
if (mounted) _handleAnimatedAndLocation();
125126
});
126127
_axis = Axis.vertical;

0 commit comments

Comments
 (0)