1+ import 'package:flutter/material.dart' ;
12import 'package:flutter/widgets.dart' ;
23import 'package:flutter_spinkit/flutter_spinkit.dart' ;
34import 'package:mxc_ui/mxc_ui.dart' ;
45
5- class LoadingBarrier extends StatelessWidget {
6+ class LoadingBarrier extends StatefulWidget {
67 const LoadingBarrier ({
78 super .key,
89 required this .isLoading,
@@ -13,15 +14,49 @@ class LoadingBarrier extends StatelessWidget {
1314 final Widget child;
1415
1516 @override
16- Widget build (BuildContext context) {
17- return Stack (
18- children: [
19- IgnorePointer (
20- ignoring: isLoading,
21- child: child,
22- ),
23- if (isLoading)
24- Align (
17+ State <LoadingBarrier > createState () => _LoadingBarrierState ();
18+ }
19+
20+ class _LoadingBarrierState extends State <LoadingBarrier > {
21+ OverlayEntry ? _overlayEntry;
22+
23+ @override
24+ void initState () {
25+ super .initState ();
26+ // Show overlay immediately if isLoading is true initially
27+ if (widget.isLoading) {
28+ WidgetsBinding .instance.addPostFrameCallback ((_) {
29+ _showOverlay ();
30+ });
31+ }
32+ }
33+
34+ @override
35+ void didUpdateWidget (LoadingBarrier oldWidget) {
36+ super .didUpdateWidget (oldWidget);
37+
38+ // Use post-frame callback to avoid build phase issues
39+ WidgetsBinding .instance.addPostFrameCallback ((_) {
40+ // Show overlay when isLoading becomes true
41+ if (widget.isLoading && _overlayEntry == null ) {
42+ _showOverlay ();
43+ }
44+ // Hide overlay when isLoading becomes false
45+ else if (! widget.isLoading && _overlayEntry != null ) {
46+ _hideOverlay ();
47+ }
48+ });
49+ }
50+
51+ void _showOverlay () {
52+ // Safety check to avoid duplicate overlays
53+ if (_overlayEntry != null ) return ;
54+
55+ _overlayEntry = OverlayEntry (
56+ builder: (context) => Positioned .fill (
57+ child: ColoredBox (
58+ color: Colors .transparent,
59+ child: Center (
2560 child: SizedBox (
2661 width: 50 ,
2762 height: 50 ,
@@ -31,7 +66,26 @@ class LoadingBarrier extends StatelessWidget {
3166 ),
3267 ),
3368 ),
34- ],
69+ ),
70+ ),
3571 );
72+
73+ Overlay .of (context).insert (_overlayEntry! );
3674 }
37- }
75+
76+ void _hideOverlay () {
77+ _overlayEntry? .remove ();
78+ _overlayEntry = null ;
79+ }
80+
81+ @override
82+ void dispose () {
83+ _hideOverlay ();
84+ super .dispose ();
85+ }
86+
87+ @override
88+ Widget build (BuildContext context) {
89+ return widget.child;
90+ }
91+ }
0 commit comments