Modify Themes Startup Behaviour (#2288)

* feat(themes): Reflect current system theme at the start of the app if the themeMode is system mode * feat(themes): Extract platform awareness for router into a function, and use where needed

David Adegoke committed May 26, 2025 at 02:43 UTC d34217323962e7e8ae6286d49b908999d061b812
3 files changed +211 -281
lib/router.dart
+186 -262
@@ -150,84 +150,78 @@ import 'src/screens/dashboard/pages/nft_import_page.dart';
150
151 late RouteSettings currentRouteSettings;
152
153 +Route<dynamic> handleRouteWithPlatformAwareness(
154 + Widget Function(BuildContext) builder, {
155 + bool fullscreenDialog = false,
156 +}) {
157 + if (Platform.isIOS) {
158 + return CupertinoPageRoute<void>(builder: builder, fullscreenDialog: fullscreenDialog);
159 + } else {
160 + return MaterialPageRoute<void>(builder: builder, fullscreenDialog: fullscreenDialog);
161 + }
162 +}
163 +
164 Route<dynamic> createRoute(RouteSettings settings) {
165 currentRouteSettings = settings;
166
167 switch (settings.name) {
168 case Routes.welcome:
169 return MaterialPageRoute<void>(
159 - builder: (_) => CreatePinWelcomePage(SettingsStoreBase.walletPasswordDirectInput));
170 + builder: (_) => CreatePinWelcomePage(
171 + SettingsStoreBase.walletPasswordDirectInput,
172 + ),
173 + );
174
175 case Routes.welcomeWallet:
176 if (SettingsStoreBase.walletPasswordDirectInput) {
177 return createRoute(RouteSettings(name: Routes.welcomePage));
178 }
165 - if (Platform.isIOS) return CupertinoPageRoute<void>(
166 - builder: (_) =>
167 - getIt.get<SetupPinCodePage>(param1: (PinCodeState<PinCodeWidget> context, dynamic _) {
168 - Navigator.of(context.context).pushNamed(Routes.welcomePage);
169 - }),
170 - fullscreenDialog: true);
171 - else return MaterialPageRoute<void>(
172 - builder: (_) =>
173 - getIt.get<SetupPinCodePage>(param1: (PinCodeState<PinCodeWidget> context, dynamic _) {
174 - Navigator.of(context.context).pushNamed(Routes.welcomePage);
175 - }),
176 - fullscreenDialog: true);
179 + return handleRouteWithPlatformAwareness(
180 + (_) => getIt.get<SetupPinCodePage>(
181 + param1: (PinCodeState<PinCodeWidget> context, dynamic _) {
182 + Navigator.of(context.context).pushNamed(Routes.welcomePage);
183 + },
184 + ),
185 + fullscreenDialog: true,
186 + );
187
188 case Routes.welcomePage:
189 return CupertinoPageRoute<void>(builder: (_) => getIt.get<WelcomePage>());
190
191 case Routes.newWalletFromWelcome:
182 - if (isSingleCoin) {
183 - return createRoute(
184 - RouteSettings(
192 + if (isSingleCoin) {
193 + return createRoute(
194 + RouteSettings(
195 name: Routes.newWallet,
186 - arguments: NewWalletArguments(type: availableWalletTypes.first)
187 - ),
188 - );
189 - }
190 - return createRoute(RouteSettings(name: Routes.newWalletType));
196 + arguments: NewWalletArguments(type: availableWalletTypes.first)),
197 + );
198 + }
199 + return createRoute(RouteSettings(name: Routes.newWalletType));
200
201 case Routes.newWalletType:
193 - if (Platform.isIOS) {
194 - return CupertinoPageRoute<void>(
195 - builder: (_) => getIt.get<NewWalletTypePage>(
196 - param1: NewWalletTypeArguments(
197 - onTypeSelected: (BuildContext context, WalletType type) =>
198 - Navigator.of(context).pushNamed(
199 - Routes.newWallet,
200 - arguments: NewWalletArguments(type: type),
201 - ),
202 - isCreate: true,
203 - isHardwareWallet: false,
204 - ),
205 - ),
206 - );
207 - } else {
208 - return MaterialPageRoute<void>(
209 - builder: (_) => getIt.get<NewWalletTypePage>(
210 - param1: NewWalletTypeArguments(
211 - onTypeSelected: (BuildContext context, WalletType type) =>
212 - Navigator.of(context).pushNamed(
213 - Routes.newWallet,
214 - arguments: NewWalletArguments(type: type),
215 - ),
216 - isCreate: true,
217 - isHardwareWallet: false,
202 + return handleRouteWithPlatformAwareness(
203 + (_) => getIt.get<NewWalletTypePage>(
204 + param1: NewWalletTypeArguments(
205 + onTypeSelected: (BuildContext context, WalletType type) =>
206 + Navigator.of(context).pushNamed(
207 + Routes.newWallet,
208 + arguments: NewWalletArguments(type: type),
209 ),
210 + isCreate: true,
211 + isHardwareWallet: false,
212 ),
220 - );
221 - }
222 -
213 + ),
214 + );
215
216 case Routes.walletGroupsDisplayPage:
217 final type = settings.arguments as WalletType;
218 final walletGroupsDisplayVM = getIt.get<WalletGroupsDisplayViewModel>(param1: type);
219
228 - if (Platform.isIOS) return CupertinoPageRoute<void>(builder: (_) => WalletGroupsDisplayPage(walletGroupsDisplayVM));
229 - else return MaterialPageRoute<void>(builder: (_) => WalletGroupsDisplayPage(walletGroupsDisplayVM));
230 -
220 + return handleRouteWithPlatformAwareness(
221 + (_) => WalletGroupsDisplayPage(
222 + walletGroupsDisplayVM,
223 + ),
224 + );
225
226 case Routes.newWallet:
227 final args = settings.arguments as NewWalletArguments;
@@ -235,15 +229,8 @@ Route<dynamic> createRoute(RouteSettings settings) {
229 final walletNewVM = getIt.get<WalletNewVM>(param1: args);
230 final seedSettingsViewModel = getIt.get<SeedSettingsViewModel>();
231
238 - if (Platform.isIOS) return CupertinoPageRoute<void>(
239 - builder: (_) => NewWalletPage(
240 - walletNewVM,
241 - seedSettingsViewModel,
242 - isChildWallet: args.isChildWallet,
243 - ),
244 - );
245 - else return MaterialPageRoute<void>(
246 - builder: (_) => NewWalletPage(
232 + return handleRouteWithPlatformAwareness(
233 + (_) => NewWalletPage(
234 walletNewVM,
235 seedSettingsViewModel,
236 isChildWallet: args.isChildWallet,
@@ -267,27 +254,18 @@ Route<dynamic> createRoute(RouteSettings settings) {
254 callback = settings.arguments as Function(PinCodeState<PinCodeWidget>, String);
255 }
256
270 - if (Platform.isIOS) return CupertinoPageRoute<void>(builder: (_) => getIt.get<SetupPinCodePage>(param1: callback));
271 - else return MaterialPageRoute<void>(builder: (_) => getIt.get<SetupPinCodePage>(param1: callback));
257 + return handleRouteWithPlatformAwareness(
258 + (_) => getIt.get<SetupPinCodePage>(param1: callback),
259 + );
260
261 case Routes.restoreWalletType:
274 - if (Platform.isIOS) return CupertinoPageRoute<void>(
275 - builder: (_) => getIt.get<NewWalletTypePage>(
276 - param1: NewWalletTypeArguments(
277 - onTypeSelected: (BuildContext context, WalletType type) {
278 - final arg = {'walletType': type};
279 - Navigator.of(context).pushNamed(Routes.restoreWallet, arguments: arg);},
280 - isCreate: false,
281 - isHardwareWallet: false,
282 - ),
283 - ),
284 - );
285 - else return MaterialPageRoute<void>(
286 - builder: (_) => getIt.get<NewWalletTypePage>(
262 + return handleRouteWithPlatformAwareness(
263 + (_) => getIt.get<NewWalletTypePage>(
264 param1: NewWalletTypeArguments(
265 onTypeSelected: (BuildContext context, WalletType type) {
266 final arg = {'walletType': type};
290 - Navigator.of(context).pushNamed(Routes.restoreWallet, arguments: arg);},
267 + Navigator.of(context).pushNamed(Routes.restoreWallet, arguments: arg);
268 + },
269 isCreate: false,
270 isHardwareWallet: false,
271 ),
@@ -300,45 +278,28 @@ Route<dynamic> createRoute(RouteSettings settings) {
278 }
279
280 final isNewInstall = settings.arguments as bool;
303 - if (Platform.isIOS) {
304 - return CupertinoPageRoute<void>(builder: (context) => getIt.get<RestoreOptionsPage>(param1: isNewInstall));
305 - } else {
306 - return MaterialPageRoute<void>(builder: (context) => getIt.get<RestoreOptionsPage>(param1: isNewInstall));
307 - }
281 + return handleRouteWithPlatformAwareness(
282 + (context) => getIt.get<RestoreOptionsPage>(param1: isNewInstall),
283 + );
284
285 case Routes.restoreWalletFromSeedKeys:
286 if (isSingleCoin) {
311 - if (Platform.isIOS) {
312 - return CupertinoPageRoute<void>(builder: (context) => getIt.get<WalletRestorePage>(param1: availableWalletTypes.first));
313 - } else {
314 - return MaterialPageRoute<void>(builder: (context) => getIt.get<WalletRestorePage>(param1: availableWalletTypes.first));
315 - }
316 - }
317 - if (Platform.isIOS) {
318 - return CupertinoPageRoute<void>(
319 - builder: (_) => getIt.get<NewWalletTypePage>(
320 - param1: NewWalletTypeArguments(
321 - onTypeSelected: (BuildContext context, WalletType type) {
322 - final arg = {'walletType': type};
323 - Navigator.of(context).pushNamed(Routes.restoreWallet, arguments: arg);},
324 - isCreate: false,
325 - isHardwareWallet: false,
326 - ),
327 - ),
328 - );
329 - } else {
330 - return MaterialPageRoute<void>(
331 - builder: (_) => getIt.get<NewWalletTypePage>(
332 - param1: NewWalletTypeArguments(
333 - onTypeSelected: (BuildContext context, WalletType type) {
334 - final arg = {'walletType': type};
335 - Navigator.of(context).pushNamed(Routes.restoreWallet, arguments: arg);},
336 - isCreate: false,
337 - isHardwareWallet: false,
338 - ),
339 - ),
287 + return handleRouteWithPlatformAwareness(
288 + (context) => getIt.get<WalletRestorePage>(param1: availableWalletTypes.first),
289 );
290 }
291 + return handleRouteWithPlatformAwareness(
292 + (context) => getIt.get<NewWalletTypePage>(
293 + param1: NewWalletTypeArguments(
294 + onTypeSelected: (BuildContext context, WalletType type) {
295 + final arg = {'walletType': type};
296 + Navigator.of(context).pushNamed(Routes.restoreWallet, arguments: arg);
297 + },
298 + isCreate: false,
299 + isHardwareWallet: false,
300 + ),
301 + ),
302 + );
303
304 case Routes.restoreWalletFromHardwareWallet:
305 if (isSingleCoin) {
@@ -346,10 +307,9 @@ Route<dynamic> createRoute(RouteSettings settings) {
307 builder: (_) => ConnectDevicePage(
308 ConnectDevicePageParams(
309 walletType: availableWalletTypes.first,
349 - onConnectDevice: (BuildContext context, _) =>
350 - Navigator.of(context).pushNamed(
351 - Routes.chooseHardwareWalletAccount,
352 - arguments: [availableWalletTypes.first]),
310 + onConnectDevice: (BuildContext context, _) => Navigator.of(context).pushNamed(
311 + Routes.chooseHardwareWalletAccount,
312 + arguments: [availableWalletTypes.first]),
313 isReconnect: false,
314 ),
315 getIt.get<LedgerViewModel>(),
@@ -362,15 +322,12 @@ Route<dynamic> createRoute(RouteSettings settings) {
322 onTypeSelected: (BuildContext context, WalletType type) {
323 final arguments = ConnectDevicePageParams(
324 walletType: type,
365 - onConnectDevice: (BuildContext context, _) =>
366 - Navigator.of(context).pushNamed(
367 - Routes.chooseHardwareWalletAccount,
368 - arguments: [type]),
325 + onConnectDevice: (BuildContext context, _) => Navigator.of(context)
326 + .pushNamed(Routes.chooseHardwareWalletAccount, arguments: [type]),
327 isReconnect: false,
328 );
329
372 - Navigator.of(context)
373 - .pushNamed(Routes.connectDevices, arguments: arguments);
330 + Navigator.of(context).pushNamed(Routes.connectDevices, arguments: arguments);
331 },
332 isCreate: false,
333 isHardwareWallet: true,
@@ -391,11 +348,9 @@ Route<dynamic> createRoute(RouteSettings settings) {
348 );
349
350 case Routes.seed:
394 - if (Platform.isIOS) {
395 - return CupertinoPageRoute<void>(builder: (context) => getIt.get<WalletSeedPage>(param1: settings.arguments as bool));
396 - } else {
397 - return MaterialPageRoute<void>(builder: (context) => getIt.get<WalletSeedPage>(param1: settings.arguments as bool));
398 - }
351 + return handleRouteWithPlatformAwareness(
352 + (context) => getIt.get<WalletSeedPage>(param1: settings.arguments as bool),
353 + );
354
355 case Routes.restoreWallet:
356 final args = settings.arguments as Map<String, dynamic>?;
@@ -421,29 +376,24 @@ Route<dynamic> createRoute(RouteSettings settings) {
376 final initialPaymentRequest = args?['paymentRequest'] as PaymentRequest?;
377 final coinTypeToSpendFrom = args?['coinTypeToSpendFrom'] as UnspentCoinType?;
378
424 - if (Platform.isIOS) {
425 - return CupertinoPageRoute<void>(builder: (context) => getIt.get<SendPage>(
426 - param1: initialPaymentRequest,
427 - param2: coinTypeToSpendFrom,
428 - ));
429 - } else {
430 - return MaterialPageRoute<void>(builder: (context) => getIt.get<SendPage>(
379 + return handleRouteWithPlatformAwareness(
380 + (context) => getIt.get<SendPage>(
381 param1: initialPaymentRequest,
382 param2: coinTypeToSpendFrom,
433 - ));
434 - }
383 + ),
384 + );
385
386 case Routes.sendTemplate:
387 return CupertinoPageRoute<void>(
388 fullscreenDialog: true, builder: (_) => getIt.get<SendTemplatePage>());
389
390 case Routes.receive:
441 - return CupertinoPageRoute<void>(builder: (context) => getIt.get<ReceivePage>());
391 + return CupertinoPageRoute<void>(builder: (context) => getIt.get<ReceivePage>());
392
393 case Routes.addressPage:
444 - if (Platform.isIOS) return CupertinoPageRoute<void>(builder: (context) => getIt.get<AddressPage>());
445 - else return MaterialPageRoute<void>(builder: (context) => getIt.get<AddressPage>());
446 -
394 + return handleRouteWithPlatformAwareness(
395 + (context) => getIt.get<AddressPage>(),
396 + );
397
398 case Routes.transactionDetails:
399 return CupertinoPageRoute<void>(
@@ -529,41 +479,39 @@ Route<dynamic> createRoute(RouteSettings settings) {
479 onWillPop: () async => false));
480
481 case Routes.silentPaymentsSettings:
532 - if (Platform.isIOS) return CupertinoPageRoute<void>(builder: (context) => getIt.get<SilentPaymentsSettingsPage>());
533 - else return MaterialPageRoute<void>(builder: (context) => getIt.get<SilentPaymentsSettingsPage>());
482 + return handleRouteWithPlatformAwareness(
483 + (context) => getIt.get<SilentPaymentsSettingsPage>(),
484 + );
485
486 case Routes.mwebSettings:
536 - if (Platform.isIOS) return CupertinoPageRoute<void>(builder: (context) => getIt.get<MwebSettingsPage>());
537 - else return MaterialPageRoute<void>(builder: (context) => getIt.get<MwebSettingsPage>());
487 + return handleRouteWithPlatformAwareness(
488 + (context) => getIt.get<MwebSettingsPage>(),
489 + );
490
491 case Routes.mwebLogs:
540 - if (Platform.isIOS) return CupertinoPageRoute<void>(builder: (context) => getIt.get<MwebLogsPage>());
541 - else return MaterialPageRoute<void>(builder: (context) => getIt.get<MwebLogsPage>());
492 + return handleRouteWithPlatformAwareness(
493 + (context) => getIt.get<MwebLogsPage>(),
494 + );
495
496 case Routes.mwebNode:
544 - if (Platform.isIOS) return CupertinoPageRoute<void>(builder: (context) => getIt.get<MwebNodePage>());
545 - else return MaterialPageRoute<void>(builder: (context) => getIt.get<MwebNodePage>());
497 + return handleRouteWithPlatformAwareness(
498 + (context) => getIt.get<MwebNodePage>(),
499 + );
500
501 case Routes.connectionSync:
548 - if (Platform.isIOS) {
549 - return CupertinoPageRoute<void>(builder: (context) => getIt.get<ConnectionSyncPage>());
550 - } else {
551 - return MaterialPageRoute<void>(builder: (context) => getIt.get<ConnectionSyncPage>());
552 - }
502 + return handleRouteWithPlatformAwareness(
503 + (context) => getIt.get<ConnectionSyncPage>(),
504 + );
505
506 case Routes.securityBackupPage:
555 - if (Platform.isIOS) {
556 - return CupertinoPageRoute<void>(builder: (context) => getIt.get<SecurityBackupPage>());
557 - } else {
558 - return MaterialPageRoute<void>(builder: (context) => getIt.get<SecurityBackupPage>());
559 - }
507 + return handleRouteWithPlatformAwareness(
508 + (context) => getIt.get<SecurityBackupPage>(),
509 + );
510
511 case Routes.privacyPage:
562 - if (Platform.isIOS) {
563 - return CupertinoPageRoute<void>(builder: (context) => getIt.get<PrivacyPage>());
564 - } else {
565 - return MaterialPageRoute<void>(builder: (context) => getIt.get<PrivacyPage>());
566 - }
512 + return handleRouteWithPlatformAwareness(
513 + (context) => getIt.get<PrivacyPage>(),
514 + );
515
516 case Routes.trocadorProvidersPage:
517 return CupertinoPageRoute<void>(
@@ -574,18 +522,14 @@ Route<dynamic> createRoute(RouteSettings settings) {
522 fullscreenDialog: true, builder: (_) => getIt.get<DomainLookupsPage>());
523
524 case Routes.displaySettingsPage:
577 - if (Platform.isIOS) {
578 - return CupertinoPageRoute<void>(builder: (context) => getIt.get<DisplaySettingsPage>());
579 - } else {
580 - return MaterialPageRoute<void>(builder: (context) => getIt.get<DisplaySettingsPage>());
581 - }
525 + return handleRouteWithPlatformAwareness(
526 + (context) => getIt.get<DisplaySettingsPage>(),
527 + );
528
529 case Routes.otherSettingsPage:
584 - if (Platform.isIOS) {
585 - return CupertinoPageRoute<void>(builder: (context) => getIt.get<OtherSettingsPage>());
586 - } else {
587 - return MaterialPageRoute<void>(builder: (context) => getIt.get<OtherSettingsPage>());
588 - }
530 + return handleRouteWithPlatformAwareness(
531 + (context) => getIt.get<OtherSettingsPage>(),
532 + );
533
534 case Routes.newNode:
535 final args = settings.arguments as Map<String, dynamic>?;
@@ -622,12 +566,9 @@ Route<dynamic> createRoute(RouteSettings settings) {
566 getIt.get<NanoAccountEditOrCreatePage>(param1: settings.arguments as NanoAccount?));
567
568 case Routes.addressBook:
625 - if (Platform.isIOS) {
626 - return CupertinoPageRoute<void>(builder: (context) => getIt.get<ContactListPage>());
627 - } else {
628 - return MaterialPageRoute<void>(builder: (context) => getIt.get<ContactListPage>());
629 - }
630 -
569 + return handleRouteWithPlatformAwareness(
570 + (context) => getIt.get<ContactListPage>(),
571 + );
572
573 case Routes.pickerAddressBook:
574 final selectedCurrency = settings.arguments as CryptoCurrency?;
@@ -638,19 +579,14 @@ Route<dynamic> createRoute(RouteSettings settings) {
579 return MaterialPageRoute<void>(builder: (_) => getIt.get<AddressListPage>());
580
581 case Routes.addressBookAddContact:
641 - if (Platform.isIOS) {
642 - return CupertinoPageRoute<void>(builder: (context) => getIt.get<ContactPage>(param1: settings.arguments as ContactRecord?));
643 - } else {
644 - return MaterialPageRoute<void>(builder: (context) => getIt.get<ContactPage>(param1: settings.arguments as ContactRecord?));
645 - }
646 -
582 + return handleRouteWithPlatformAwareness(
583 + (context) => getIt.get<ContactPage>(param1: settings.arguments as ContactRecord?),
584 + );
585
586 case Routes.showKeys:
649 - if (Platform.isIOS) {
650 - return CupertinoPageRoute<void>(builder: (context) => getIt.get<WalletKeysPage>());
651 - } else {
652 - return MaterialPageRoute<void>(builder: (context) => getIt.get<WalletKeysPage>());
653 - }
587 + return handleRouteWithPlatformAwareness(
588 + (context) => getIt.get<WalletKeysPage>(),
589 + );
590
591 case Routes.exchangeTrade:
592 return CupertinoPageRoute<void>(builder: (_) => getIt.get<ExchangeTradePage>());
@@ -669,11 +605,9 @@ Route<dynamic> createRoute(RouteSettings settings) {
605
606 case Routes.buySellPage:
607 final args = settings.arguments as bool;
672 - if (Platform.isIOS) {
673 - return CupertinoPageRoute<void>(builder: (context) => getIt.get<BuySellPage>(param1: args));
674 - } else {
675 - return MaterialPageRoute<void>(builder: (context) => getIt.get<BuySellPage>(param1: args));
676 - }
608 + return handleRouteWithPlatformAwareness(
609 + (context) => getIt.get<BuySellPage>(param1: args),
610 + );
611
612 case Routes.buyOptionsPage:
613 final args = settings.arguments as List;
@@ -681,7 +615,8 @@ Route<dynamic> createRoute(RouteSettings settings) {
615
616 case Routes.paymentMethodOptionsPage:
617 final args = settings.arguments as List;
684 - return MaterialPageRoute<void>(builder: (_) => getIt.get<PaymentMethodOptionsPage>(param1: args));
618 + return MaterialPageRoute<void>(
619 + builder: (_) => getIt.get<PaymentMethodOptionsPage>(param1: args));
620
621 case Routes.buyWebView:
622 final args = settings.arguments as List;
@@ -690,12 +625,9 @@ Route<dynamic> createRoute(RouteSettings settings) {
625 fullscreenDialog: true, builder: (_) => getIt.get<BuyWebViewPage>(param1: args));
626
627 case Routes.exchange:
693 - if (Platform.isIOS) {
694 - return CupertinoPageRoute<void>(builder: (context) => getIt.get<ExchangePage>(param1: settings.arguments as PaymentRequest?));
695 - } else {
696 - return MaterialPageRoute<void>(builder: (context) => getIt.get<ExchangePage>(param1: settings.arguments as PaymentRequest?));
697 - }
698 -
628 + return handleRouteWithPlatformAwareness(
629 + (context) => getIt.get<ExchangePage>(param1: settings.arguments as PaymentRequest?),
630 + );
631
632 case Routes.exchangeTemplate:
633 return CupertinoPageRoute<void>(builder: (_) => getIt.get<ExchangeTemplatePage>());
@@ -717,11 +649,9 @@ Route<dynamic> createRoute(RouteSettings settings) {
649 builder: (_) => getIt.get<TransactionSuccessPage>(param1: settings.arguments as String));
650
651 case Routes.backup:
720 - if (Platform.isIOS) {
721 - return CupertinoPageRoute<void>(builder: (context) => getIt.get<BackupPage>());
722 - } else {
723 - return MaterialPageRoute<void>(builder: (context) => getIt.get<BackupPage>());
724 - }
652 + return handleRouteWithPlatformAwareness(
653 + (context) => getIt.get<BackupPage>(),
654 + );
655
656 case Routes.editBackupPassword:
657 return CupertinoPageRoute<void>(builder: (_) => getIt.get<EditBackupPasswordPage>());
@@ -731,26 +661,23 @@ Route<dynamic> createRoute(RouteSettings settings) {
661 fullscreenDialog: true, builder: (_) => getIt.get<RestoreFromBackupPage>());
662
663 case Routes.support:
734 - if (Platform.isIOS) {
735 - return CupertinoPageRoute<void>(builder: (context) => getIt.get<SupportPage>());
736 - } else {
737 - return MaterialPageRoute<void>(builder: (context) => getIt.get<SupportPage>());
738 - }
664 + return handleRouteWithPlatformAwareness(
665 + (context) => getIt.get<SupportPage>(),
666 + );
667
668 case Routes.supportLiveChat:
669 return CupertinoPageRoute<void>(builder: (_) => getIt.get<SupportChatPage>());
670
671 case Routes.supportOtherLinks:
744 - if (Platform.isIOS) {
745 - return CupertinoPageRoute<void>(builder: (context) => getIt.get<SupportOtherLinksPage>());
746 - } else {
747 - return MaterialPageRoute<void>(builder: (context) => getIt.get<SupportOtherLinksPage>());
748 - }
672 + return handleRouteWithPlatformAwareness(
673 + (context) => getIt.get<SupportOtherLinksPage>(),
674 + );
675
676 case Routes.unspentCoinsList:
677 final coinTypeToSpendFrom = settings.arguments as UnspentCoinType?;
752 - return MaterialPageRoute<void>(
753 - builder: (_) => getIt.get<UnspentCoinsListPage>(param1: coinTypeToSpendFrom));
678 + return handleRouteWithPlatformAwareness(
679 + (context) => getIt.get<UnspentCoinsListPage>(param1: coinTypeToSpendFrom),
680 + );
681
682 case Routes.unspentCoinsDetails:
683 final args = settings.arguments as List;
@@ -765,32 +692,37 @@ Route<dynamic> createRoute(RouteSettings settings) {
692 ));
693
694 case Routes.cakePayCardsPage:
768 - if (Platform.isIOS) return CupertinoPageRoute<void>(builder: (context) => getIt.get<CakePayCardsPage>());
769 - else return MaterialPageRoute<void>(builder: (context) => getIt.get<CakePayCardsPage>());
770 -
695 + return handleRouteWithPlatformAwareness(
696 + (context) => getIt.get<CakePayCardsPage>(),
697 + );
698
699 case Routes.cakePayBuyCardPage:
700 final args = settings.arguments as List;
774 - if (Platform.isIOS) return CupertinoPageRoute<void>(builder: (_) => getIt.get<CakePayBuyCardPage>(param1: args));
775 - else return MaterialPageRoute<void>(builder: (_) => getIt.get<CakePayBuyCardPage>(param1: args));
701 + return handleRouteWithPlatformAwareness(
702 + (context) => getIt.get<CakePayBuyCardPage>(param1: args),
703 + );
704
705 case Routes.cakePayBuyCardDetailPage:
706 final args = settings.arguments as List;
779 - if (Platform.isIOS) return CupertinoPageRoute<void>(builder: (_) => getIt.get<CakePayBuyCardDetailPage>(param1: args));
780 - else return MaterialPageRoute<void>(builder: (_) => getIt.get<CakePayBuyCardDetailPage>(param1: args));
707 + return handleRouteWithPlatformAwareness(
708 + (context) => getIt.get<CakePayBuyCardDetailPage>(param1: args),
709 + );
710
711 case Routes.cakePayWelcomePage:
783 - if (Platform.isIOS) return CupertinoPageRoute<void>(builder: (_) => getIt.get<CakePayWelcomePage>(),);
784 - else return MaterialPageRoute<void>(builder: (_) => getIt.get<CakePayWelcomePage>(),);
712 + return handleRouteWithPlatformAwareness(
713 + (context) => getIt.get<CakePayWelcomePage>(),
714 + );
715
716 case Routes.cakePayVerifyOtpPage:
717 final args = settings.arguments as List;
788 - if (Platform.isIOS) return CupertinoPageRoute<void>(builder: (_) => getIt.get<CakePayVerifyOtpPage>(param1: args));
789 - else return MaterialPageRoute<void>(builder: (_) => getIt.get<CakePayVerifyOtpPage>(param1: args));
718 + return handleRouteWithPlatformAwareness(
719 + (context) => getIt.get<CakePayVerifyOtpPage>(param1: args),
720 + );
721
722 case Routes.cakePayAccountPage:
792 - if (Platform.isIOS) return CupertinoPageRoute<void>(builder: (_) => getIt.get<CakePayAccountPage>());
793 - else return MaterialPageRoute<void>(builder: (_) => getIt.get<CakePayAccountPage>());
723 + return handleRouteWithPlatformAwareness(
724 + (context) => getIt.get<CakePayAccountPage>(),
725 + );
726
727 case Routes.webViewPage:
728 final args = settings.arguments as List;
@@ -808,28 +740,18 @@ Route<dynamic> createRoute(RouteSettings settings) {
740 final toggleTestnet = args['toggleTestnet'] as Function(bool? val);
741 final restoredWallet = args['restoredWallet'] as RestoredWallet?;
742
811 - if (Platform.isIOS) return CupertinoPageRoute<void>(
812 - builder: (_) => AdvancedPrivacySettingsPage(
813 - isFromRestore: isFromRestore,
814 - isChildWallet: isChildWallet,
815 - useTestnet: useTestnet,
816 - toggleUseTestnet: toggleTestnet,
817 - advancedPrivacySettingsViewModel:
818 - getIt.get<AdvancedPrivacySettingsViewModel>(param1: type),
819 - nodeViewModel: getIt.get<NodeCreateOrEditViewModel>(param1: type, param2: false),
820 - seedSettingsViewModel: getIt.get<SeedSettingsViewModel>(),
821 - ));
822 - else return MaterialPageRoute<void>(
823 - builder: (_) => AdvancedPrivacySettingsPage(
824 - isFromRestore: isFromRestore,
825 - isChildWallet: isChildWallet,
826 - useTestnet: useTestnet,
827 - toggleUseTestnet: toggleTestnet,
828 - advancedPrivacySettingsViewModel:
829 - getIt.get<AdvancedPrivacySettingsViewModel>(param1: type),
830 - nodeViewModel: getIt.get<NodeCreateOrEditViewModel>(param1: type, param2: false),
831 - seedSettingsViewModel: getIt.get<SeedSettingsViewModel>(),
832 - ));
743 + return handleRouteWithPlatformAwareness(
744 + (context) => AdvancedPrivacySettingsPage(
745 + isFromRestore: isFromRestore,
746 + isChildWallet: isChildWallet,
747 + useTestnet: useTestnet,
748 + toggleUseTestnet: toggleTestnet,
749 + advancedPrivacySettingsViewModel:
750 + getIt.get<AdvancedPrivacySettingsViewModel>(param1: type),
751 + nodeViewModel: getIt.get<NodeCreateOrEditViewModel>(param1: type, param2: false),
752 + seedSettingsViewModel: getIt.get<SeedSettingsViewModel>(),
753 + ),
754 + );
755
756 case Routes.anonPayInvoicePage:
757 final args = settings.arguments as List;
@@ -850,8 +772,8 @@ Route<dynamic> createRoute(RouteSettings settings) {
772 final sessionId = arguments.first as String;
773 final transactionInfo = arguments[1] as TransactionInfo?;
774 return CupertinoPageRoute<void>(
853 - builder: (_) => getIt.get<PayjoinDetailsPage>(
854 - param1: sessionId, param2: transactionInfo));
775 + builder: (_) =>
776 + getIt.get<PayjoinDetailsPage>(param1: sessionId, param2: transactionInfo));
777
778 case Routes.desktop_actions:
779 return PageRouteBuilder(
@@ -884,7 +806,8 @@ Route<dynamic> createRoute(RouteSettings settings) {
806 return MaterialPageRoute<void>(builder: (_) => getIt.get<Setup2FAInfoPage>());
807
808 case Routes.urqrAnimatedPage:
887 - return MaterialPageRoute<void>(builder: (_) => getIt.get<AnimatedURPage>(param1: settings.arguments));
809 + return MaterialPageRoute<void>(
810 + builder: (_) => getIt.get<AnimatedURPage>(param1: settings.arguments));
811
812 case Routes.homeSettings:
813 return CupertinoPageRoute<void>(
@@ -964,14 +887,15 @@ Route<dynamic> createRoute(RouteSettings settings) {
887 );
888
889 case Routes.exchangeTradeExternalSendPage:
967 - return MaterialPageRoute<void>(builder: (_) => getIt.get<ExchangeTradeExternalSendPage>(),);
890 + return MaterialPageRoute<void>(
891 + builder: (_) => getIt.get<ExchangeTradeExternalSendPage>(),
892 + );
893
894 case Routes.backgroundSync:
970 - if (Platform.isIOS) {
971 - return CupertinoPageRoute<void>(builder: (context) => getIt.get<BackgroundSyncPage>());
972 - } else {
973 - return MaterialPageRoute<void>(builder: (context) => getIt.get<BackgroundSyncPage>());
974 - }
895 + return handleRouteWithPlatformAwareness(
896 + (context) => getIt.get<BackgroundSyncPage>(),
897 + );
898 +
899 case Routes.devMoneroBackgroundSync:
900 return MaterialPageRoute<void>(
901 builder: (_) => getIt.get<DevMoneroBackgroundSyncPage>(),
lib/src/widgets/base_text_form_field.dart
-8
@@ -125,7 +125,6 @@ class BaseTextFormField extends StatelessWidget {
125 suffix: suffix,
126 suffixIcon: suffixIcon,
127 filled: !hasUnderlineBorder,
128 - //border: !hasUnderlineBorder ? OutlineInputBorder() : null,
128 fillColor:
129 hasUnderlineBorder ? null : fillColor ?? Theme.of(context).colorScheme.surfaceContainer,
130 hintStyle: placeholderTextStyle ??
@@ -162,13 +161,6 @@ class BaseTextFormField extends StatelessWidget {
161 ),
162 )
163 : null,
165 - // OutlineInputBorder(
166 - // borderRadius: BorderRadius.circular(10),
167 - // borderSide: BorderSide(
168 - // color: Theme.of(context).colorScheme.outlineVariant,
169 - // width: 1.5,
170 - // )
171 - // ),
164 errorBorder: hasUnderlineBorder
165 ? UnderlineInputBorder(
166 borderSide: BorderSide(color: Theme.of(context).colorScheme.error),
lib/themes/core/theme_store.dart
+25 -11
@@ -40,17 +40,22 @@ abstract class ThemeStoreBase with Store {
40 }
41
42 @action
43 - Future<void> setThemeMode(ThemeMode mode, {bool shouldRefreshTheme = true}) async {
43 + Future<void> setThemeMode(ThemeMode mode) async {
44 if (_themeMode == mode) return;
45
46 _themeMode = mode;
47 - await sharedPreferences.setString(PreferencesKey.themeMode, mode.toString());
47
49 - if (mode == ThemeMode.system && shouldRefreshTheme) {
48 + await _saveThemeModeToPrefs(mode);
49 +
50 + if (mode == ThemeMode.system) {
51 setTheme(getThemeFromSystem());
52 }
53 }
54
55 + Future<void> _saveThemeModeToPrefs(ThemeMode mode) async {
56 + await sharedPreferences.setString(PreferencesKey.themeMode, mode.toString());
57 + }
58 +
59 /// Loads the saved theme preferences
60 Future<void> loadThemePreferences() async {
61 sharedPreferences = await SharedPreferences.getInstance();
@@ -95,7 +100,7 @@ abstract class ThemeStoreBase with Store {
100 /// Handles theme loading for mobile platforms
101 Future<void> _handleMobileTheme(bool isNewInstall) async {
102 if (isNewInstall) {
98 - await _setSystemTheme();
103 + await _setSystemTheme(isNewInstall: isNewInstall);
104 } else {
105 await loadSavedTheme();
106 }
@@ -112,27 +117,36 @@ abstract class ThemeStoreBase with Store {
117
118 final theme = ThemeList.deserialize(raw: savedTheme);
119
115 - if (_currentTheme != theme) {
116 - await setTheme(theme);
117 - }
118 -
120 final newThemeMode = _getThemeModeOnStartUp(theme, isFromBackup);
121
122 + if (newThemeMode == ThemeMode.system) {
123 + await _setSystemTheme();
124 + return;
125 + }
126 +
127 if (_themeMode != newThemeMode) {
122 - await setThemeMode(newThemeMode, shouldRefreshTheme: false);
128 + await setThemeMode(newThemeMode);
129 + }
130 +
131 + if (_currentTheme != theme) {
132 + await setTheme(theme);
133 }
134 } catch (e) {
135 await _setSystemTheme();
136 }
137 }
138
129 - Future<void> _setSystemTheme() async {
139 + Future<void> _setSystemTheme({bool isNewInstall = false}) async {
140 final systemTheme = getThemeFromSystem();
141
142 if (_currentTheme != systemTheme) {
143 await setTheme(systemTheme);
144 }
145
146 + if (isNewInstall) {
147 + await _saveThemeModeToPrefs(ThemeMode.system);
148 + }
149 +
150 if (_themeMode != ThemeMode.system) {
151 await setThemeMode(ThemeMode.system);
152 }
@@ -142,7 +156,7 @@ abstract class ThemeStoreBase with Store {
156 if (isFromBackup || _themeMode != ThemeMode.system) {
157 return theme.isDark ? ThemeMode.dark : ThemeMode.light;
158 }
145 -
159 +
160 return ThemeMode.system;
161 }
162