Move more pref to controller

This commit is contained in:
Ming Ming 2024-08-18 18:07:56 +08:00
parent 3ab0829ba2
commit 0feb6aa59b
11 changed files with 76 additions and 75 deletions

View file

@ -5,7 +5,6 @@ import 'dart:convert';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/di_container.dart';
import 'package:nc_photos/entity/collection/util.dart'; import 'package:nc_photos/entity/collection/util.dart';
import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/entity/pref.dart';
import 'package:nc_photos/json_util.dart'; import 'package:nc_photos/json_util.dart';
@ -24,7 +23,7 @@ part 'pref_controller/util.dart';
@npSubjectAccessor @npSubjectAccessor
class PrefController { class PrefController {
PrefController(this._c); PrefController(this.pref);
Future<bool> setAccounts(List<Account> value) => _set<List<Account>>( Future<bool> setAccounts(List<Account> value) => _set<List<Account>>(
controller: _accountsController, controller: _accountsController,
@ -32,7 +31,7 @@ class PrefController {
value: value, value: value,
); );
Future<bool> setCurrentAccountIndex(int value) => _setOrRemove<int>( Future<bool> setCurrentAccountIndex(int? value) => _setOrRemove<int>(
controller: _currentAccountIndexController, controller: _currentAccountIndexController,
setter: (pref, value) => pref.setCurrentAccountIndex(value), setter: (pref, value) => pref.setCurrentAccountIndex(value),
remover: (pref) => pref.setCurrentAccountIndex(null), remover: (pref) => pref.setCurrentAccountIndex(null),
@ -203,7 +202,7 @@ class PrefController {
required T value, required T value,
}) => }) =>
_doSet( _doSet(
pref: _c.pref, pref: pref,
controller: controller, controller: controller,
setter: setter, setter: setter,
value: value, value: value,
@ -217,7 +216,7 @@ class PrefController {
T? defaultValue, T? defaultValue,
}) => }) =>
_doSetOrRemove( _doSetOrRemove(
pref: _c.pref, pref: pref,
controller: controller, controller: controller,
setter: setter, setter: setter,
remover: remover, remover: remover,
@ -233,90 +232,91 @@ class PrefController {
} }
} }
final DiContainer _c; final Pref pref;
@npSubjectAccessor @npSubjectAccessor
late final _accountsController = late final _accountsController =
BehaviorSubject.seeded(_c.pref.getAccounts3() ?? []); BehaviorSubject.seeded(pref.getAccounts3() ?? []);
@npSubjectAccessor @npSubjectAccessor
late final _currentAccountIndexController = late final _currentAccountIndexController =
BehaviorSubject.seeded(_c.pref.getCurrentAccountIndex()); BehaviorSubject.seeded(pref.getCurrentAccountIndex());
@npSubjectAccessor @npSubjectAccessor
late final _languageController = late final _languageController =
BehaviorSubject.seeded(_langIdToAppLanguage(_c.pref.getLanguageOr(0))); BehaviorSubject.seeded(_langIdToAppLanguage(pref.getLanguageOr(0)));
@npSubjectAccessor @npSubjectAccessor
late final _homePhotosZoomLevelController = late final _homePhotosZoomLevelController =
BehaviorSubject.seeded(_c.pref.getHomePhotosZoomLevelOr(0)); BehaviorSubject.seeded(pref.getHomePhotosZoomLevelOr(0));
@npSubjectAccessor @npSubjectAccessor
late final _albumBrowserZoomLevelController = late final _albumBrowserZoomLevelController =
BehaviorSubject.seeded(_c.pref.getAlbumBrowserZoomLevelOr(0)); BehaviorSubject.seeded(pref.getAlbumBrowserZoomLevelOr(0));
@npSubjectAccessor @npSubjectAccessor
late final _homeAlbumsSortController = BehaviorSubject.seeded( late final _homeAlbumsSortController = BehaviorSubject.seeded(
CollectionSort.values[_c.pref.getHomeAlbumsSortOr(0)]); CollectionSort.values[pref.getHomeAlbumsSortOr(0)]);
@npSubjectAccessor @npSubjectAccessor
late final _isEnableExifController = late final _isEnableExifController =
BehaviorSubject.seeded(_c.pref.isEnableExifOr(true)); BehaviorSubject.seeded(pref.isEnableExifOr(true));
@npSubjectAccessor @npSubjectAccessor
late final _shouldProcessExifWifiOnlyController = late final _shouldProcessExifWifiOnlyController =
BehaviorSubject.seeded(_c.pref.shouldProcessExifWifiOnlyOr(true)); BehaviorSubject.seeded(pref.shouldProcessExifWifiOnlyOr(true));
@npSubjectAccessor @npSubjectAccessor
late final _memoriesRangeController = late final _memoriesRangeController =
BehaviorSubject.seeded(_c.pref.getMemoriesRangeOr(2)); BehaviorSubject.seeded(pref.getMemoriesRangeOr(2));
@npSubjectAccessor @npSubjectAccessor
late final _viewerScreenBrightnessController = late final _viewerScreenBrightnessController =
BehaviorSubject.seeded(_c.pref.getViewerScreenBrightnessOr(-1)); BehaviorSubject.seeded(pref.getViewerScreenBrightnessOr(-1));
@npSubjectAccessor @npSubjectAccessor
late final _isViewerForceRotationController = late final _isViewerForceRotationController =
BehaviorSubject.seeded(_c.pref.isViewerForceRotationOr(false)); BehaviorSubject.seeded(pref.isViewerForceRotationOr(false));
@npSubjectAccessor @npSubjectAccessor
late final _gpsMapProviderController = BehaviorSubject.seeded( late final _gpsMapProviderController = BehaviorSubject.seeded(
GpsMapProvider.values[_c.pref.getGpsMapProviderOr(0)]); GpsMapProvider.values[pref.getGpsMapProviderOr(0)]);
@npSubjectAccessor @npSubjectAccessor
late final _isAlbumBrowserShowDateController = late final _isAlbumBrowserShowDateController =
BehaviorSubject.seeded(_c.pref.isAlbumBrowserShowDateOr(false)); BehaviorSubject.seeded(pref.isAlbumBrowserShowDateOr(false));
@npSubjectAccessor @npSubjectAccessor
late final _isDoubleTapExitController = late final _isDoubleTapExitController =
BehaviorSubject.seeded(_c.pref.isDoubleTapExitOr(false)); BehaviorSubject.seeded(pref.isDoubleTapExitOr(false));
@npSubjectAccessor @npSubjectAccessor
late final _isSaveEditResultToServerController = late final _isSaveEditResultToServerController =
BehaviorSubject.seeded(_c.pref.isSaveEditResultToServerOr(true)); BehaviorSubject.seeded(pref.isSaveEditResultToServerOr(true));
@npSubjectAccessor @npSubjectAccessor
late final _enhanceMaxSizeController = BehaviorSubject.seeded( late final _enhanceMaxSizeController = BehaviorSubject.seeded(
SizeInt(_c.pref.getEnhanceMaxWidthOr(), _c.pref.getEnhanceMaxHeightOr())); SizeInt(pref.getEnhanceMaxWidthOr(), pref.getEnhanceMaxHeightOr()));
@npSubjectAccessor @npSubjectAccessor
late final _isDarkThemeController = late final _isDarkThemeController =
BehaviorSubject.seeded(_c.pref.isDarkThemeOr(false)); BehaviorSubject.seeded(pref.isDarkThemeOr(false));
@npSubjectAccessor @npSubjectAccessor
late final _isFollowSystemThemeController = late final _isFollowSystemThemeController =
BehaviorSubject.seeded(_c.pref.isFollowSystemThemeOr(false)); BehaviorSubject.seeded(pref.isFollowSystemThemeOr(false));
@npSubjectAccessor @npSubjectAccessor
late final _isUseBlackInDarkThemeController = late final _isUseBlackInDarkThemeController =
BehaviorSubject.seeded(_c.pref.isUseBlackInDarkThemeOr(false)); BehaviorSubject.seeded(pref.isUseBlackInDarkThemeOr(false));
@NpSubjectAccessor(type: "Color?") @NpSubjectAccessor(type: "Color?")
late final _seedColorController = late final _seedColorController =
BehaviorSubject<Color?>.seeded(_c.pref.getSeedColor()?.let(Color.new)); BehaviorSubject<Color?>.seeded(pref.getSeedColor()?.let(Color.new));
@NpSubjectAccessor(type: "Color?") @NpSubjectAccessor(type: "Color?")
late final _secondarySeedColorController = BehaviorSubject<Color?>.seeded( late final _secondarySeedColorController = BehaviorSubject<Color?>.seeded(
_c.pref.getSecondarySeedColor()?.let(Color.new)); pref.getSecondarySeedColor()?.let(Color.new));
@npSubjectAccessor @npSubjectAccessor
late final _isDontShowVideoPreviewHintController = late final _isDontShowVideoPreviewHintController =
BehaviorSubject.seeded(_c.pref.isDontShowVideoPreviewHintOr(false)); BehaviorSubject.seeded(pref.isDontShowVideoPreviewHintOr(false));
@npSubjectAccessor @npSubjectAccessor
late final _mapBrowserPrevPositionController = BehaviorSubject.seeded(_c.pref late final _mapBrowserPrevPositionController = BehaviorSubject.seeded(pref
.getMapBrowserPrevPosition() .getMapBrowserPrevPosition()
?.let(tryJsonDecode) ?.let(tryJsonDecode)
?.let(_tryMapCoordFromJson)); ?.let(_tryMapCoordFromJson));
@npSubjectAccessor @npSubjectAccessor
late final _isNewHttpEngineController = late final _isNewHttpEngineController =
BehaviorSubject.seeded(_c.pref.isNewHttpEngine() ?? false); BehaviorSubject.seeded(pref.isNewHttpEngine() ?? false);
@npSubjectAccessor @npSubjectAccessor
late final _firstRunTimeController = BehaviorSubject.seeded(_c.pref late final _firstRunTimeController = BehaviorSubject.seeded(pref
.getFirstRunTime() .getFirstRunTime()
?.let((v) => DateTime.fromMillisecondsSinceEpoch(v).toUtc())); ?.let((v) => DateTime.fromMillisecondsSinceEpoch(v).toUtc()));
@npSubjectAccessor @npSubjectAccessor
late final _lastVersionController = late final _lastVersionController =
BehaviorSubject.seeded(_c.pref.getLastVersion() ?? BehaviorSubject.seeded(pref.getLastVersion() ??
// v6 is the last version without saving the version number in pref // v6 is the last version without saving the version number in pref
(_c.pref.getSetupProgress() == null ? k.version : 6)); (pref.getSetupProgress() == null ? k.version : 6));
} }
extension PrefControllerExtension on PrefController { extension PrefControllerExtension on PrefController {
@ -331,7 +331,7 @@ extension PrefControllerExtension on PrefController {
@npSubjectAccessor @npSubjectAccessor
class SecurePrefController { class SecurePrefController {
SecurePrefController(this._c); SecurePrefController(this.securePref);
Future<bool> setProtectedPageAuthType(ProtectedPageAuthType? value) => Future<bool> setProtectedPageAuthType(ProtectedPageAuthType? value) =>
_setOrRemove<ProtectedPageAuthType>( _setOrRemove<ProtectedPageAuthType>(
@ -366,7 +366,7 @@ class SecurePrefController {
required T value, required T value,
}) => }) =>
_doSet( _doSet(
pref: _c.securePref, pref: securePref,
controller: controller, controller: controller,
setter: setter, setter: setter,
value: value, value: value,
@ -381,7 +381,7 @@ class SecurePrefController {
T? defaultValue, T? defaultValue,
}) => }) =>
_doSetOrRemove( _doSetOrRemove(
pref: _c.securePref, pref: securePref,
controller: controller, controller: controller,
setter: setter, setter: setter,
remover: remover, remover: remover,
@ -389,18 +389,19 @@ class SecurePrefController {
defaultValue: defaultValue, defaultValue: defaultValue,
); );
final DiContainer _c; final Pref securePref;
@npSubjectAccessor @npSubjectAccessor
late final _protectedPageAuthTypeController = BehaviorSubject.seeded(_c late final _protectedPageAuthTypeController = BehaviorSubject.seeded(
.securePref securePref
.getProtectedPageAuthType() .getProtectedPageAuthType()
?.let((e) => ProtectedPageAuthType.values[e])); ?.let((e) => ProtectedPageAuthType.values[e]));
@npSubjectAccessor @npSubjectAccessor
late final _protectedPageAuthPinController = late final _protectedPageAuthPinController =
BehaviorSubject.seeded(_c.securePref.getProtectedPageAuthPin()?.toCi()); BehaviorSubject.seeded(securePref.getProtectedPageAuthPin()?.toCi());
@npSubjectAccessor @npSubjectAccessor
late final _protectedPageAuthPasswordController = BehaviorSubject.seeded( late final _protectedPageAuthPasswordController =
_c.securePref.getProtectedPageAuthPassword()?.toCi()); BehaviorSubject.seeded(securePref.getProtectedPageAuthPassword()?.toCi());
} }
Future<bool> _doSet<T>({ Future<bool> _doSet<T>({

View file

@ -110,6 +110,15 @@ extension on Pref {
return provider.setInt(PrefKey.firstRunTime, value); return provider.setInt(PrefKey.firstRunTime, value);
} }
} }
int? getCurrentAccountIndex() => provider.getInt(PrefKey.currentAccountIndex);
Future<bool> setCurrentAccountIndex(int? value) {
if (value == null) {
return provider.remove(PrefKey.currentAccountIndex);
} else {
return provider.setInt(PrefKey.currentAccountIndex, value);
}
}
} }
MapCoord? _tryMapCoordFromJson(dynamic json) { MapCoord? _tryMapCoordFromJson(dynamic json) {

View file

@ -1,14 +1,6 @@
part of '../pref.dart'; part of '../pref.dart';
extension PrefExtension on Pref { extension PrefExtension on Pref {
Account? getCurrentAccount() {
try {
return getAccounts3()![getCurrentAccountIndex()!];
} catch (_) {
return null;
}
}
List<Account>? getAccounts3() { List<Account>? getAccounts3() {
final jsonObjs = provider.getStringList(PrefKey.accounts3); final jsonObjs = provider.getStringList(PrefKey.accounts3);
return jsonObjs return jsonObjs
@ -36,17 +28,6 @@ extension PrefExtension on Pref {
} }
} }
int? getCurrentAccountIndex() => provider.getInt(PrefKey.currentAccountIndex);
int getCurrentAccountIndexOr(int def) => getCurrentAccountIndex() ?? def;
Future<bool> setCurrentAccountIndex(int? value) {
if (value == null) {
return _remove(PrefKey.currentAccountIndex);
} else {
return _set<int>(PrefKey.currentAccountIndex, value,
(key, value) => provider.setInt(key, value));
}
}
int? getHomePhotosZoomLevel() => provider.getInt(PrefKey.homePhotosZoomLevel); int? getHomePhotosZoomLevel() => provider.getInt(PrefKey.homePhotosZoomLevel);
int getHomePhotosZoomLevelOr(int def) => getHomePhotosZoomLevel() ?? def; int getHomePhotosZoomLevelOr(int def) => getHomePhotosZoomLevel() ?? def;
Future<bool> setHomePhotosZoomLevel(int value) => _set<int>( Future<bool> setHomePhotosZoomLevel(int value) => _set<int>(

View file

@ -5,6 +5,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/app_localizations.dart'; import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/controller/pref_controller.dart';
import 'package:nc_photos/db/entity_converter.dart'; import 'package:nc_photos/db/entity_converter.dart';
import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/entity/pref.dart';
import 'package:nc_photos/entity/pref_util.dart' as pref_util; import 'package:nc_photos/entity/pref_util.dart' as pref_util;
@ -315,8 +316,9 @@ class _SignInState extends State<SignIn> {
_log.shout("[_connect] Failed reading pref for account: $account", e, _log.shout("[_connect] Failed reading pref for account: $account", e,
stackTrace); stackTrace);
} }
final prefController = context.read<PrefController>();
unawaited(Pref().setAccounts3(accounts)); unawaited(Pref().setAccounts3(accounts));
unawaited(Pref().setCurrentAccountIndex(accounts.indexOf(account))); unawaited(prefController.setCurrentAccountIndex(accounts.indexOf(account)));
} }
final _formKey = GlobalKey<FormState>(); final _formKey = GlobalKey<FormState>();

View file

@ -10,6 +10,7 @@ import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/app_init.dart' as app_init; import 'package:nc_photos/app_init.dart' as app_init;
import 'package:nc_photos/app_localizations.dart'; import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/controller/pref_controller.dart';
import 'package:nc_photos/di_container.dart'; import 'package:nc_photos/di_container.dart';
import 'package:nc_photos/entity/file.dart'; import 'package:nc_photos/entity/file.dart';
import 'package:nc_photos/entity/file/data_source.dart'; import 'package:nc_photos/entity/file/data_source.dart';
@ -104,7 +105,8 @@ class _Service {
} }
Future<void> _doWork() async { Future<void> _doWork() async {
final account = Pref().getCurrentAccount(); final prefController = PrefController(Pref());
final account = prefController.currentAccountValue;
if (account == null) { if (account == null) {
_log.shout("[_doWork] account == null"); _log.shout("[_doWork] account == null");
return; return;

View file

@ -47,7 +47,7 @@ class _Bloc extends Bloc<_Event, _State> with BlocLogger {
if (index == -1) { if (index == -1) {
throw StateError("Account not found"); throw StateError("Account not found");
} }
await _c.pref.setCurrentAccountIndex(index); await prefController.setCurrentAccountIndex(index);
emit(state.copyWith(newSelectAccount: ev.account)); emit(state.copyWith(newSelectAccount: ev.account));
}); });
} }
@ -60,7 +60,8 @@ class _Bloc extends Bloc<_Event, _State> with BlocLogger {
try { try {
await _prefLock.protect(() async { await _prefLock.protect(() async {
final accounts = _c.pref.getAccounts3()!; final accounts = _c.pref.getAccounts3()!;
final currentAccount = accounts[_c.pref.getCurrentAccountIndex()!]; final currentAccount =
accounts[prefController.currentAccountIndexValue!];
accounts.remove(ev.account); accounts.remove(ev.account);
final newAccountIndex = accounts.indexOf(currentAccount); final newAccountIndex = accounts.indexOf(currentAccount);
if (newAccountIndex == -1) { if (newAccountIndex == -1) {
@ -74,7 +75,7 @@ class _Bloc extends Bloc<_Event, _State> with BlocLogger {
stackTrace); stackTrace);
} }
await Pref().setAccounts3(accounts); await Pref().setAccounts3(accounts);
await Pref().setCurrentAccountIndex(newAccountIndex); await prefController.setCurrentAccountIndex(newAccountIndex);
// check if the same account (server + userId) still exists in known // check if the same account (server + userId) still exists in known
// accounts // accounts

View file

@ -78,10 +78,10 @@ class MyApp extends StatelessWidget {
return MultiRepositoryProvider( return MultiRepositoryProvider(
providers: [ providers: [
RepositoryProvider( RepositoryProvider(
create: (_) => PrefController(_c), create: (_) => PrefController(_c.pref),
), ),
RepositoryProvider( RepositoryProvider(
create: (_) => SecurePrefController(_c), create: (_) => SecurePrefController(_c.securePref),
), ),
RepositoryProvider( RepositoryProvider(
create: (context) => AccountController( create: (context) => AccountController(

View file

@ -1,11 +1,12 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:kiwi/kiwi.dart'; import 'package:kiwi/kiwi.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/app_localizations.dart'; import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/controller/pref_controller.dart';
import 'package:nc_photos/di_container.dart'; import 'package:nc_photos/di_container.dart';
import 'package:nc_photos/entity/file.dart'; import 'package:nc_photos/entity/file.dart';
import 'package:nc_photos/entity/pref.dart';
import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/k.dart' as k;
import 'package:nc_photos/snack_bar_manager.dart'; import 'package:nc_photos/snack_bar_manager.dart';
import 'package:nc_photos/theme.dart'; import 'package:nc_photos/theme.dart';
@ -84,7 +85,7 @@ class _ResultViewerState extends State<ResultViewer> {
Future<void> _doWork() async { Future<void> _doWork() async {
_log.info("[_doWork] URL: ${widget.resultUrl}"); _log.info("[_doWork] URL: ${widget.resultUrl}");
_account = _c.pref.getCurrentAccount(); _account = context.read<PrefController>().currentAccountValue;
if (_account == null) { if (_account == null) {
SnackBarManager().showSnackBar(SnackBar( SnackBarManager().showSnackBar(SnackBar(
content: Text(L10n.global().errorUnauthenticated), content: Text(L10n.global().errorUnauthenticated),

View file

@ -1,5 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:nc_photos/app_localizations.dart'; import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/controller/pref_controller.dart';
import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/entity/pref.dart';
import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/k.dart' as k;
import 'package:nc_photos/widget/home.dart'; import 'package:nc_photos/widget/home.dart';
@ -97,7 +99,7 @@ class _SetupState extends State<Setup> {
void _onDonePressed() { void _onDonePressed() {
Pref().setSetupProgress(_PageId.all); Pref().setSetupProgress(_PageId.all);
final account = Pref().getCurrentAccount(); final account = context.read<PrefController>().currentAccountValue;
if (account == null) { if (account == null) {
Navigator.pushReplacementNamed(context, SignIn.routeName); Navigator.pushReplacementNamed(context, SignIn.routeName);
} else { } else {

View file

@ -6,6 +6,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/app_localizations.dart'; import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/controller/pref_controller.dart';
import 'package:nc_photos/db/entity_converter.dart'; import 'package:nc_photos/db/entity_converter.dart';
import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/entity/pref.dart';
import 'package:nc_photos/entity/pref_util.dart' as pref_util; import 'package:nc_photos/entity/pref_util.dart' as pref_util;
@ -183,8 +184,9 @@ class _SignInState extends State<SignIn> {
_log.shout("[_connect] Failed reading pref for account: $account", e, _log.shout("[_connect] Failed reading pref for account: $account", e,
stackTrace); stackTrace);
} }
final prefController = context.read<PrefController>();
unawaited(Pref().setAccounts3(accounts)); unawaited(Pref().setAccounts3(accounts));
unawaited(Pref().setCurrentAccountIndex(accounts.indexOf(account))); unawaited(prefController.setCurrentAccountIndex(accounts.indexOf(account)));
} }
final _formKey = GlobalKey<FormState>(); final _formKey = GlobalKey<FormState>();

View file

@ -118,7 +118,7 @@ class _Bloc extends Bloc<_Event, _State> with BlocLogger {
} catch (e, stackTrace) { } catch (e, stackTrace) {
_log.shout("[_upgrade46] Failed while clearDefaultCache", e, stackTrace); _log.shout("[_upgrade46] Failed while clearDefaultCache", e, stackTrace);
unawaited(Pref().setAccounts3(null)); unawaited(Pref().setAccounts3(null));
unawaited(Pref().setCurrentAccountIndex(null)); unawaited(prefController.setCurrentAccountIndex(null));
} }
} }