Skip to content

Commit 6cb1ff1

Browse files
Improve overlay handling
1 parent 97aec2d commit 6cb1ff1

File tree

1 file changed

+25
-21
lines changed

1 file changed

+25
-21
lines changed

lib/src/widgets/overlay_widget/overlay_widget.dart

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,13 @@ class OverlayWidget extends StatefulWidget {
2525

2626
class _OverlayWidgetState extends State<OverlayWidget> {
2727
bool _isVisible = true;
28-
28+
OverlayEntry? _overlay;
2929
@override
3030
void initState() {
3131
super.initState();
32-
WidgetsBinding.instance
33-
.addPostFrameCallback((_) => showOverlay(widget.overlayWidget));
32+
final overlay = OverlayEntry(builder: (context) => widget.overlayWidget);
33+
_overlay = overlay;
34+
WidgetsBinding.instance.addPostFrameCallback((_) => _showOverlay(overlay));
3435
}
3536

3637
@override
@@ -42,33 +43,36 @@ class _OverlayWidgetState extends State<OverlayWidget> {
4243
alignment: widget.alignment,
4344
child: IconButton(
4445
color: Colors.purple,
45-
onPressed: () {
46-
if (!_isVisible) {
47-
showOverlay(widget.overlayWidget);
48-
_isVisible = true;
49-
} else {
50-
hideOverlay(entry);
51-
_isVisible = false;
52-
}
53-
},
46+
onPressed: _onTap,
5447
icon: const Icon(Icons.chevron_right),
5548
),
5649
)
5750
],
5851
);
5952
}
6053

61-
void showOverlay(Widget overlayWidget) {
62-
OverlayEntry? entry;
63-
entry = OverlayEntry(
64-
builder: (context) => overlayWidget,
65-
);
66-
final overlay = Overlay.of(context);
54+
void _onTap() {
55+
_isVisible = !_isVisible;
56+
_onVisibilityChanged(_isVisible);
57+
}
6758

68-
overlay?.insert(entry);
59+
void _onVisibilityChanged(bool visible) {
60+
final overlay = _overlay;
61+
if (overlay == null) return;
62+
if (visible) {
63+
_showOverlay(overlay);
64+
} else {
65+
overlay.remove();
66+
}
6967
}
7068

71-
void hideOverlay(OverlayEntry? entry) {
72-
entry?.remove();
69+
void _showOverlay(OverlayEntry overlay) {
70+
Overlay.of(context)?.insert(overlay);
71+
}
72+
73+
@override
74+
void dispose() {
75+
_overlay?.dispose();
76+
super.dispose();
7377
}
7478
}

0 commit comments

Comments
 (0)