|
1 | 1 | part of flutter_control; |
2 | 2 |
|
3 | | -extension OverlayExtension on CoreContext { |
| 3 | +extension OverlayControl on CoreContext { |
4 | 4 | OverlayEntry? showOverlay({ |
5 | | - required CoreContext context, |
6 | 5 | required dynamic key, |
7 | 6 | required Widget Function(Rect parent) builder, |
8 | 7 | GlobalKey? parentKey, |
| 8 | + BuildContext? parentContext, |
9 | 9 | bool barrierDismissible = true, |
10 | 10 | }) { |
11 | | - final overlay = Overlay.of(context); |
| 11 | + if (!mounted) { |
| 12 | + return null; |
| 13 | + } |
| 14 | + |
| 15 | + final overlay = Overlay.of(this); |
12 | 16 |
|
13 | | - if (context.args.containsKey(ObjectTag.of(key))) { |
14 | | - return getOverlay(context, key); |
| 17 | + if (args.containsKey(ObjectTag.of(key))) { |
| 18 | + return getOverlay(key); |
15 | 19 | } |
16 | 20 |
|
17 | 21 | if (key is GlobalKey && parentKey == null) { |
18 | 22 | parentKey = key; |
19 | 23 | } |
20 | 24 |
|
21 | | - final box = (parentKey?.currentState?.context.findRenderObject() ?? |
22 | | - context.findRenderObject()) as RenderBox; |
23 | | - final location = box.localToGlobal(Offset.zero); |
24 | | - final size = box.size; |
| 25 | + parentContext ??= parentKey?.currentState?.context; |
| 26 | + |
| 27 | + Widget build() { |
| 28 | + final box = (parentContext?.findRenderObject() ?? findRenderObject()) |
| 29 | + as RenderBox?; |
25 | 30 |
|
26 | | - final child = builder( |
27 | | - Rect.fromLTWH(location.dx, location.dy, size.width, size.height)); |
| 31 | + if (box == null) { |
| 32 | + final size = view.viewSize; |
| 33 | + return builder(Rect.fromLTWH(0.0, 0.0, size.width, size.height)); |
| 34 | + } |
| 35 | + |
| 36 | + final location = box.localToGlobal(Offset.zero); |
| 37 | + final size = box.size; |
| 38 | + |
| 39 | + return builder( |
| 40 | + Rect.fromLTWH(location.dx, location.dy, size.width, size.height)); |
| 41 | + } |
28 | 42 |
|
29 | 43 | final entry = OverlayEntry( |
30 | 44 | builder: (_) => barrierDismissible |
31 | 45 | ? Stack( |
32 | 46 | children: [ |
33 | 47 | GestureDetector( |
34 | | - onTap: () => hideOverlay(context, key), |
| 48 | + onTap: () => hideOverlay(key), |
35 | 49 | ), |
36 | | - child, |
| 50 | + build(), |
37 | 51 | ], |
38 | 52 | ) |
39 | | - : child, |
| 53 | + : build(), |
40 | 54 | ); |
41 | 55 |
|
42 | | - context.args.add(key: ObjectTag.of(key), value: entry); |
| 56 | + args.add(key: ObjectTag.of(key), value: entry); |
43 | 57 |
|
44 | 58 | overlay.insert(entry); |
45 | 59 |
|
46 | 60 | return entry; |
47 | 61 | } |
48 | 62 |
|
49 | | - OverlayEntry? getOverlay(CoreContext context, dynamic key) => |
50 | | - context.args.get<OverlayEntry>(key: ObjectTag.of(key)); |
| 63 | + OverlayEntry? getOverlay(dynamic key) => |
| 64 | + args.get<OverlayEntry>(key: ObjectTag.of(key)); |
51 | 65 |
|
52 | | - bool hideOverlay(CoreContext context, dynamic key) { |
53 | | - final overlay = getOverlay(context, key); |
| 66 | + bool hideOverlay(dynamic key) { |
| 67 | + final overlay = getOverlay(key); |
54 | 68 |
|
55 | 69 | if (overlay != null) { |
56 | 70 | overlay.remove(); |
57 | | - context.args.remove(key: ObjectTag.of(key)); |
| 71 | + args.remove(key: ObjectTag.of(key)); |
58 | 72 |
|
59 | 73 | return true; |
60 | 74 | } |
61 | 75 |
|
62 | 76 | return false; |
63 | 77 | } |
64 | 78 |
|
65 | | - bool clearOverlays(CoreContext context) { |
66 | | - final items = context.args.getAll<OverlayEntry>(); |
| 79 | + bool clearOverlays() { |
| 80 | + final items = args.getAll<OverlayEntry>(); |
67 | 81 |
|
68 | 82 | if (items.isNotEmpty) { |
69 | | - items.forEach((element) { |
| 83 | + for (final element in items) { |
70 | 84 | element.remove(); |
71 | | - }); |
| 85 | + } |
72 | 86 |
|
73 | | - context.args.removeAll<OverlayEntry>(); |
| 87 | + args.removeAll<OverlayEntry>(); |
74 | 88 |
|
75 | 89 | return true; |
76 | 90 | } |
|
0 commit comments