@@ -20,6 +20,7 @@ import '../models/page_design.dart';
2020import '../routing/route_parser.dart' ;
2121import '../routing/route_state.dart' ;
2222import '../routing/router_delegate.dart' ;
23+ import '../services/service_binding.dart' ;
2324import '../services/service_registry.dart' ;
2425import '../utils/device_info.dart' ;
2526import '../utils/locale.dart' ;
@@ -57,6 +58,9 @@ class _PageControlState extends State<PageControl> with WidgetsBindingObserver {
5758 late final AppLifecycleListener _appLifecycleListener;
5859 ServiceRegistry ? _pageServices;
5960 ServiceRegistry ? _userServices;
61+ String ? _userServicesUid;
62+ ServiceBinding ? _windowService;
63+ Control ? _windowControl;
6064 bool ? _prevOnKeyboardEvent;
6165 bool _keyboardHandlerSubscribed = false ;
6266 String ? _prevViewRoutes;
@@ -95,12 +99,15 @@ class _PageControlState extends State<PageControl> with WidgetsBindingObserver {
9599
96100 _attachKeyboardListenerIfNeeded ();
97101 widget.control.addInvokeMethodListener (_invokeMethod);
102+ widget.control.addListener (_onPageControlChanged);
103+ _ensureServiceRegistries ();
98104 }
99105
100106 @override
101107 void didChangeDependencies () {
102108 debugPrint ("Page.didChangeDependencies: ${widget .control .id }" );
103109 super .didChangeDependencies ();
110+ _ensureServiceRegistries ();
104111 _loadFontsIfNeeded (FletBackend .of (context));
105112 }
106113
@@ -109,26 +116,7 @@ class _PageControlState extends State<PageControl> with WidgetsBindingObserver {
109116 debugPrint ("Page.didUpdateWidget: ${widget .control .id }" );
110117 super .didUpdateWidget (oldWidget);
111118 _updateMultiViews ();
112-
113- // page services
114- _pageServices ?? = ServiceRegistry (
115- control: widget.control,
116- propertyName: "_services" ,
117- backend: FletBackend .of (context));
118-
119- // user services
120- var userServicesControl = widget.control.child ("_user_services" );
121- if (userServicesControl != null ) {
122- if (_userServices == null ||
123- _userServices? .control.internals? ["uid" ] !=
124- userServicesControl.internals? ["uid" ]) {
125- _userServices = ServiceRegistry (
126- control: userServicesControl,
127- propertyName: "_services" ,
128- backend: FletBackend .of (context));
129- }
130- }
131-
119+ _ensureServiceRegistries ();
132120 _attachKeyboardListenerIfNeeded ();
133121 _loadFontsIfNeeded (FletBackend .of (context));
134122 }
@@ -148,9 +136,60 @@ class _PageControlState extends State<PageControl> with WidgetsBindingObserver {
148136 HardwareKeyboard .instance.removeHandler (_handleKeyDown);
149137 }
150138 widget.control.removeInvokeMethodListener (_invokeMethod);
139+ widget.control.removeListener (_onPageControlChanged);
140+ _pageServices? .dispose ();
141+ _userServices? .dispose ();
142+ _windowService? .dispose ();
151143 super .dispose ();
152144 }
153145
146+ void _onPageControlChanged () {
147+ _ensureServiceRegistries ();
148+ }
149+
150+ void _ensureServiceRegistries () {
151+ if (! mounted) {
152+ return ;
153+ }
154+ var backend = FletBackend .of (context);
155+
156+ _pageServices ?? = ServiceRegistry (
157+ control: widget.control,
158+ propertyName: "_services" ,
159+ backend: backend);
160+
161+ var userServicesControl = widget.control.child ("_user_services" );
162+ if (userServicesControl != null ) {
163+ var uid = userServicesControl.internals? ["uid" ];
164+ if (_userServices == null || _userServicesUid != uid) {
165+ _userServices? .dispose ();
166+ _userServices = ServiceRegistry (
167+ control: userServicesControl,
168+ propertyName: "_services" ,
169+ backend: backend);
170+ _userServicesUid = uid;
171+ }
172+ } else if (_userServices != null ) {
173+ _userServices? .dispose ();
174+ _userServices = null ;
175+ _userServicesUid = null ;
176+ }
177+
178+ var windowControl = widget.control.child ("window" , visibleOnly: false );
179+ if (windowControl != null ) {
180+ if (! identical (windowControl, _windowControl)) {
181+ _windowService? .dispose ();
182+ _windowService =
183+ ServiceBinding (control: windowControl, backend: backend);
184+ _windowControl = windowControl;
185+ }
186+ } else if (_windowService != null ) {
187+ _windowService? .dispose ();
188+ _windowService = null ;
189+ _windowControl = null ;
190+ }
191+ }
192+
154193 Future <dynamic > _invokeMethod (String name, dynamic args) async {
155194 debugPrint ("Page.$name ($args )" );
156195
@@ -341,8 +380,7 @@ class _PageControlState extends State<PageControl> with WidgetsBindingObserver {
341380 var appStatus = context
342381 .select< FletBackend , ({bool isLoading, String error})> ((backend) =>
343382 (isLoading: backend.isLoading, error: backend.error));
344- var appStartupScreenMessage =
345- backend.appStartupScreenMessage ?? "" ;
383+ var appStartupScreenMessage = backend.appStartupScreenMessage ?? "" ;
346384 var formattedErrorMessage =
347385 backend.formatAppErrorMessage (appStatus.error);
348386
@@ -432,6 +470,18 @@ class _PageControlState extends State<PageControl> with WidgetsBindingObserver {
432470 ? control.getCupertinoTheme ("dark_theme" , context, Brightness .dark)
433471 : control.getCupertinoTheme ("theme" , context, Brightness .dark);
434472
473+ var materialTheme = themeMode == ThemeMode .dark ||
474+ ((themeMode == null || themeMode == ThemeMode .system) &&
475+ brightness == Brightness .dark)
476+ ? darkTheme
477+ : lightTheme;
478+
479+ Widget scaffoldMessengerBuilder (BuildContext context, Widget ? child) {
480+ return Theme (
481+ data: materialTheme ?? lightTheme ?? ThemeData (),
482+ child: ScaffoldMessenger (child: child ?? const SizedBox .shrink ()));
483+ }
484+
435485 var showSemanticsDebugger =
436486 control.getBool ("show_semantics_debugger" , false )! ;
437487
@@ -442,6 +492,7 @@ class _PageControlState extends State<PageControl> with WidgetsBindingObserver {
442492 showSemanticsDebugger: showSemanticsDebugger,
443493 title: windowTitle,
444494 theme: cupertinoTheme,
495+ builder: scaffoldMessengerBuilder,
445496 supportedLocales: localeConfiguration.supportedLocales,
446497 locale: localeConfiguration.locale,
447498 localizationsDelegates: localizationsDelegates,
@@ -454,6 +505,7 @@ class _PageControlState extends State<PageControl> with WidgetsBindingObserver {
454505 routeInformationParser: _routeParser,
455506 title: windowTitle,
456507 theme: cupertinoTheme,
508+ builder: scaffoldMessengerBuilder,
457509 localizationsDelegates: localizationsDelegates,
458510 supportedLocales: localeConfiguration.supportedLocales,
459511 locale: localeConfiguration.locale,
@@ -503,14 +555,12 @@ class _PageControlState extends State<PageControl> with WidgetsBindingObserver {
503555
504556 var backend = FletBackend .of (context);
505557 var showAppStartupScreen = backend.showAppStartupScreen ?? false ;
506- var appStartupScreenMessage =
507- backend.appStartupScreenMessage ?? "" ;
558+ var appStartupScreenMessage = backend.appStartupScreenMessage ?? "" ;
508559
509560 var appStatus =
510561 context.select< FletBackend , ({bool isLoading, String error})> (
511562 (backend) => (isLoading: backend.isLoading, error: backend.error));
512- var formattedErrorMessage =
513- backend.formatAppErrorMessage (appStatus.error);
563+ var formattedErrorMessage = backend.formatAppErrorMessage (appStatus.error);
514564
515565 var views = widget.control.children ("views" );
516566 List <Page <dynamic >> pages = [];
0 commit comments