@@ -25,12 +25,13 @@ class OverlayWidget extends StatefulWidget {
2525
2626class _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