diff --git a/lib/data/model/app/bak/backup2.dart b/lib/data/model/app/bak/backup2.dart index c324d00c..79ac17f3 100644 --- a/lib/data/model/app/bak/backup2.dart +++ b/lib/data/model/app/bak/backup2.dart @@ -4,6 +4,9 @@ import 'dart:io'; import 'package:fl_lib/fl_lib.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:logging/logging.dart'; +import 'package:server_box/data/provider/private_key.dart'; +import 'package:server_box/data/provider/server/all.dart'; +import 'package:server_box/data/provider/snippet.dart'; import 'package:server_box/data/res/misc.dart'; import 'package:server_box/data/res/store.dart'; @@ -44,17 +47,17 @@ abstract class BackupV2 with _$BackupV2 implements Mergeable { Future merge({bool force = false}) async { _loggerV2.info('Merging...'); - // Merge each store - await Mergeable.mergeStore(backupData: spis, store: Stores.server, force: force); - await Mergeable.mergeStore(backupData: snippets, store: Stores.snippet, force: force); - await Mergeable.mergeStore(backupData: keys, store: Stores.key, force: force); + // Merge each store and check if changes were made + final serverChanged = await Mergeable.mergeStore(backupData: spis, store: Stores.server, force: force); + final snippetChanged = await Mergeable.mergeStore(backupData: snippets, store: Stores.snippet, force: force); + final keyChanged = await Mergeable.mergeStore(backupData: keys, store: Stores.key, force: force); await Mergeable.mergeStore(backupData: container, store: Stores.container, force: force); await Mergeable.mergeStore(backupData: history, store: Stores.history, force: force); await Mergeable.mergeStore(backupData: settings, store: Stores.setting, force: force); - // Reload providers and notify listeners - Provider.reload(); - RNodes.app.notify(); + if (serverChanged) GlobalRef.gRef?.read(serversNotifierProvider.notifier).reload(); + if (snippetChanged) GlobalRef.gRef?.read(snippetNotifierProvider.notifier).reload(); + if (keyChanged) GlobalRef.gRef?.read(privateKeyNotifierProvider.notifier).reload(); _loggerV2.info('Merge completed'); } diff --git a/lib/data/provider/private_key.dart b/lib/data/provider/private_key.dart index a737e9af..26f10d98 100644 --- a/lib/data/provider/private_key.dart +++ b/lib/data/provider/private_key.dart @@ -9,17 +9,25 @@ part 'private_key.g.dart'; @freezed abstract class PrivateKeyState with _$PrivateKeyState { - const factory PrivateKeyState({ - @Default([]) List keys, - }) = _PrivateKeyState; + const factory PrivateKeyState({@Default([]) List keys}) = _PrivateKeyState; } @Riverpod(keepAlive: true) class PrivateKeyNotifier extends _$PrivateKeyNotifier { @override PrivateKeyState build() { + return _load(); + } + + void reload() { + final newState = _load(); + if (newState == state) return; + state = newState; + } + + PrivateKeyState _load() { final keys = Stores.key.fetch(); - return PrivateKeyState(keys: keys); + return stateOrNull?.copyWith(keys: keys) ?? PrivateKeyState(keys: keys); } void add(PrivateKeyInfo info) { diff --git a/lib/data/provider/server/all.dart b/lib/data/provider/server/all.dart index 4e4a194e..06e65c2f 100644 --- a/lib/data/provider/server/all.dart +++ b/lib/data/provider/server/all.dart @@ -1,4 +1,3 @@ - import 'dart:async'; import 'package:fl_lib/fl_lib.dart'; @@ -30,12 +29,17 @@ abstract class ServersState with _$ServersState { class ServersNotifier extends _$ServersNotifier { @override ServersState build() { - // Initialize with empty state, load data asynchronously - Future.microtask(() => _load()); - return const ServersState(); + return _load(); } - Future _load() async { + Future reload() async { + final newState = _load(); + if (newState == state) return; + state = newState; + await refresh(); + } + + ServersState _load() { final spis = Stores.server.fetch(); final newServers = {}; final newServerOrder = []; @@ -59,7 +63,8 @@ class ServersNotifier extends _$ServersNotifier { final newTags = _calculateTags(newServers); - state = state.copyWith(servers: newServers, serverOrder: newServerOrder, tags: newTags); + return stateOrNull?.copyWith(servers: newServers, serverOrder: newServerOrder, tags: newTags) ?? + ServersState(servers: newServers, serverOrder: newServerOrder, tags: newTags); } Set _calculateTags(Map servers) { @@ -270,4 +275,4 @@ class ServersNotifier extends _$ServersNotifier { } bakSync.sync(milliDelay: 1000); } -} \ No newline at end of file +} diff --git a/lib/data/provider/snippet.dart b/lib/data/provider/snippet.dart index 0e96bfd7..130e06aa 100644 --- a/lib/data/provider/snippet.dart +++ b/lib/data/provider/snippet.dart @@ -20,24 +20,32 @@ abstract class SnippetState with _$SnippetState { class SnippetNotifier extends _$SnippetNotifier { @override SnippetState build() { + return _load(); + } + + void reload() { + final newState = _load(); + if (newState == state) return; + state = newState; + } + + SnippetState _load() { final snippets = Stores.snippet.fetch(); final order = Stores.setting.snippetOrder.fetch(); - + List orderedSnippets = snippets; if (order.isNotEmpty) { - final surplus = snippets.reorder( - order: order, - finder: (n, name) => n.name == name, - ); + final surplus = snippets.reorder(order: order, finder: (n, name) => n.name == name); order.removeWhere((e) => surplus.any((ele) => ele == e)); if (order != Stores.setting.snippetOrder.fetch()) { Stores.setting.snippetOrder.put(order); } orderedSnippets = snippets; } - - final tags = _computeTags(orderedSnippets); - return SnippetState(snippets: orderedSnippets, tags: tags); + + final newTags = _computeTags(orderedSnippets); + return stateOrNull?.copyWith(snippets: orderedSnippets, tags: newTags) ?? + SnippetState(snippets: orderedSnippets, tags: newTags); } Set _computeTags(List snippets) { diff --git a/lib/view/page/home.dart b/lib/view/page/home.dart index 20d82900..9daf07cd 100644 --- a/lib/view/page/home.dart +++ b/lib/view/page/home.dart @@ -22,7 +22,7 @@ class HomePage extends ConsumerStatefulWidget { } class _HomePageState extends ConsumerState - with AutomaticKeepAliveClientMixin, AfterLayoutMixin, WidgetsBindingObserver { + with AutomaticKeepAliveClientMixin, AfterLayoutMixin, WidgetsBindingObserver, GlobalRef { late final PageController _pageController; final _selectIndex = ValueNotifier(0); diff --git a/pubspec.lock b/pubspec.lock index bf270744..b0c52f82 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -497,8 +497,8 @@ packages: dependency: "direct main" description: path: "." - ref: "v1.0.344" - resolved-ref: "9c7dd603b125fa3ca7a65d466c8fb41383997bd3" + ref: "v1.0.345" + resolved-ref: "1b797643ef7603dd825caf96a6c57b88dbd23c34" url: "https://github.com/lppcg/fl_lib" source: git version: "0.0.1" diff --git a/pubspec.yaml b/pubspec.yaml index 39083d6f..d5ba8706 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -63,7 +63,7 @@ dependencies: fl_lib: git: url: https://github.com/lppcg/fl_lib - ref: v1.0.344 + ref: v1.0.345 flutter_gbk2utf8: ^1.0.1 dependency_overrides: