Skip to content

Commit 6d7c751

Browse files
app: Pull out _handleGenerateInitialRoutes
And remove the use of Builder widget, which is unncessary after this refactor.
1 parent 4ece284 commit 6d7c751

File tree

1 file changed

+46
-41
lines changed

1 file changed

+46
-41
lines changed

lib/widgets/app.dart

+46-41
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,23 @@ class _ZulipAppState extends State<ZulipApp> with WidgetsBindingObserver {
152152
super.dispose();
153153
}
154154

155+
List<Route<dynamic>> _handleGenerateInitialRoutes(String initialRoute) {
156+
// The `_ZulipAppState.context` lacks the required ancestors. Instead
157+
// we use the Navigator which should be available when this callback is
158+
// called and it's context should have the required ancestors.
159+
final context = ZulipApp.navigatorKey.currentContext!;
160+
final globalStore = GlobalStoreWidget.of(context);
161+
162+
// TODO(#524) choose initial account as last one used
163+
final initialAccountId = globalStore.accounts.firstOrNull?.id;
164+
return [
165+
if (initialAccountId == null)
166+
MaterialWidgetRoute(page: const ChooseAccountPage())
167+
else
168+
HomePage.buildRoute(accountId: initialAccountId),
169+
];
170+
}
171+
155172
Future<void> _handleInitialRoute() async {
156173
final initialRouteUrl = Uri.parse(WidgetsBinding.instance.platformDispatcher.defaultRouteName);
157174
if (initialRouteUrl case Uri(scheme: 'zulip', host: 'notification')) {
@@ -176,47 +193,35 @@ class _ZulipAppState extends State<ZulipApp> with WidgetsBindingObserver {
176193
Widget build(BuildContext context) {
177194
final themeData = zulipThemeData(context);
178195
return GlobalStoreWidget(
179-
child: Builder(builder: (context) {
180-
final globalStore = GlobalStoreWidget.of(context);
181-
return MaterialApp(
182-
onGenerateTitle: (BuildContext context) {
183-
return ZulipLocalizations.of(context).zulipAppTitle;
184-
},
185-
localizationsDelegates: ZulipLocalizations.localizationsDelegates,
186-
supportedLocales: ZulipLocalizations.supportedLocales,
187-
theme: themeData,
188-
189-
navigatorKey: ZulipApp.navigatorKey,
190-
navigatorObservers: widget.navigatorObservers ?? const [],
191-
builder: (BuildContext context, Widget? child) {
192-
if (!ZulipApp.ready.value) {
193-
SchedulerBinding.instance.addPostFrameCallback(
194-
(_) => widget._declareReady());
195-
}
196-
GlobalLocalizations.zulipLocalizations = ZulipLocalizations.of(context);
197-
return child!;
198-
},
199-
200-
// We use onGenerateInitialRoutes for the real work of specifying the
201-
// initial nav state. To do that we need [MaterialApp] to decide to
202-
// build a [Navigator]... which means specifying either `home`, `routes`,
203-
// `onGenerateRoute`, or `onUnknownRoute`. Make it `onGenerateRoute`.
204-
// It never actually gets called, though: `onGenerateInitialRoutes`
205-
// handles startup, and then we always push whole routes with methods
206-
// like [Navigator.push], never mere names as with [Navigator.pushNamed].
207-
onGenerateRoute: (_) => null,
208-
209-
onGenerateInitialRoutes: (_) {
210-
// TODO(#524) choose initial account as last one used
211-
final initialAccountId = globalStore.accounts.firstOrNull?.id;
212-
return [
213-
if (initialAccountId == null)
214-
MaterialWidgetRoute(page: const ChooseAccountPage())
215-
else
216-
HomePage.buildRoute(accountId: initialAccountId),
217-
];
218-
});
219-
}));
196+
child: MaterialApp(
197+
onGenerateTitle: (BuildContext context) {
198+
return ZulipLocalizations.of(context).zulipAppTitle;
199+
},
200+
localizationsDelegates: ZulipLocalizations.localizationsDelegates,
201+
supportedLocales: ZulipLocalizations.supportedLocales,
202+
theme: themeData,
203+
204+
navigatorKey: ZulipApp.navigatorKey,
205+
navigatorObservers: widget.navigatorObservers ?? const [],
206+
builder: (BuildContext context, Widget? child) {
207+
if (!ZulipApp.ready.value) {
208+
SchedulerBinding.instance.addPostFrameCallback(
209+
(_) => widget._declareReady());
210+
}
211+
GlobalLocalizations.zulipLocalizations = ZulipLocalizations.of(context);
212+
return child!;
213+
},
214+
215+
// We use onGenerateInitialRoutes for the real work of specifying the
216+
// initial nav state. To do that we need [MaterialApp] to decide to
217+
// build a [Navigator]... which means specifying either `home`, `routes`,
218+
// `onGenerateRoute`, or `onUnknownRoute`. Make it `onGenerateRoute`.
219+
// It never actually gets called, though: `onGenerateInitialRoutes`
220+
// handles startup, and then we always push whole routes with methods
221+
// like [Navigator.push], never mere names as with [Navigator.pushNamed].
222+
onGenerateRoute: (_) => null,
223+
224+
onGenerateInitialRoutes: _handleGenerateInitialRoutes));
220225
}
221226
}
222227

0 commit comments

Comments
 (0)