I have used your approach for authentication stream.
That is okey.
In my project, I needed to use onGenerateRoute: property of MaterialApp widget which is child of AuthWidgetBuilder.
When the stream: _authService.onAuthStateChanged emit new state once login or logout event, while MaterialApp constructs new tree, MatrearialApp home: doesn't activated and doesn't route to AuthWidget.
If you refresh whole application, then no problem, but again if you logout or login the MaterialApp does not visit home: property.
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:family_infopool/core/models/user.dart';
import 'package:family_infopool/core/services/connectivity_service.dart';
import 'package:family_infopool/ui/widgets/auth_widget_builder.dart';
import 'package:family_infopool/core/states/share_app_state.dart';
import 'package:family_infopool/core/managers/dialog_manager.dart';
import 'package:family_infopool/core/services/navigation_service.dart';
import 'package:family_infopool/core/services/dialog_service.dart';
import 'package:family_infopool/ui/views/startup_view.dart';
import 'package:family_infopool/ui/widgets/header_footer.dart';
import 'package:family_infopool/ui/router.dart';
import 'package:family_infopool/locator.dart';
import 'core/services/live_user_profile_service.dart';
void main() {
setupLocator();
LiveUserProfile dummyLiveUserProfile = LiveUserProfile(user: User.initial());
runApp(MultiProvider(
providers: [
Provider<LiveUserProfile>.value(value: dummyLiveUserProfile),
ChangeNotifierProvider<ShareAppState>(
create: (context) => ShareAppState()),
StreamProvider<ConnectivityStatus>(
create: (context) => ConnectivityService().connectionStatusController.stream),
],
child:MyApp()
));
}
final RouteObserver routeObserver = RouteObserver();
final MyRouteObserver myRouteObserver = MyRouteObserver();
class MyApp extends StatelessWidget {
@OverRide
Widget build(BuildContext context) {
print('(MyApp): MyApp starts.');
return KeyShare(
child: GestureDetector(
onTap: () => FocusScope.of(context).unfocus(),
child: AuthWidgetBuilder(
builder: (context, userSnapshot) {
print('(MyApp): MaterialApp starts.[${userSnapshot.connectionState}]');
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'iPikuka Family InfoPool',
theme: ThemeData(),
home: StartUpView(userSnapshot: userSnapshot), //which is smilar implematation of AuthWidget
navigatorObservers: <NavigatorObserver>[myRouteObserver],
onGenerateRoute: generateRoute,
navigatorKey: locator<NavigationService>().navigationKey,
builder: (context, child) {
print('(MyApp): Navigator for Dialog Service created.');
//There was a problem if visit this Navigator when ConnectionState.waiting, so this is a prevention solution.
if (userSnapshot.connectionState != ConnectionState.active)
return Container();
else
return Navigator(
observers: <NavigatorObserver>[routeObserver],
key: locator<DialogService>().dialogNavigationKey,
onGenerateRoute: (settings) => MaterialPageRoute(
maintainState: true,
builder: (context) => DialogManager(child: child)),
);
},
);
},
),
),
);
}
}