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