diff --git a/lib/core/extension/order.dart b/lib/core/extension/order.dart index 8ec05ffa..c2ffef8b 100644 --- a/lib/core/extension/order.dart +++ b/lib/core/extension/order.dart @@ -81,4 +81,14 @@ extension OrderX on Order { addAll(missed); return surplus; } + + /// Dart uses memory address to compare objects by default. + /// This method compares the values of the objects. + bool equals(Order other) { + if (length != other.length) return false; + for (var i = 0; i < length; i++) { + if (this[i] != other[i]) return false; + } + return true; + } } diff --git a/lib/core/update.dart b/lib/core/update.dart index 8d5c1386..c0aa49af 100644 --- a/lib/core/update.dart +++ b/lib/core/update.dart @@ -39,7 +39,7 @@ Future doUpdate(BuildContext context, {bool force = false}) async { return; } - locator().setNewestBuild(newest); + locator().newestBuild = newest; if (!force && newest <= BuildData.build) { _logger.info('Update ignored due to current: ${BuildData.build}, ' diff --git a/lib/core/utils/icloud.dart b/lib/core/utils/icloud.dart index dae1799c..a1f846ca 100644 --- a/lib/core/utils/icloud.dart +++ b/lib/core/utils/icloud.dart @@ -103,23 +103,26 @@ class ICloud { final errs = []; final allFiles = await getAll(); - // remove files not in relativePaths + /// remove files not in relativePaths allFiles.removeWhere((e) => !relativePaths.contains(e.relativePath)); - // upload files not in iCloud + final mission = >[]; + + /// upload files not in iCloud final missed = relativePaths.where((e) { return !allFiles.any((f) => f.relativePath == e); }); - for (final e in missed) { + mission.addAll(missed.map((e) async { final err = await upload(relativePath: e); if (err != null) { errs.add(err); } - } + //_logger.info('upload missed: $e'); + })); final docPath = await docDir; - // compare files in iCloud and local - for (final file in allFiles) { + /// compare files in iCloud and local + mission.addAll(allFiles.map((file) async { final relativePath = file.relativePath; /// Check date @@ -130,16 +133,23 @@ class ICloud { if (err != null) { errs.add(err); } - continue; + //_logger.info('local not found: $relativePath'); + return; } final localDate = await localFile.lastModified(); - if (file.contentChangeDate.isBefore(localDate)) { - /// Local is newer than remote, so upload local file + final remoteDate = file.contentChangeDate; + + /// Same date, skip + if (remoteDate.difference(localDate) == Duration.zero) return; + + /// Local is newer than remote, so upload local file + if (remoteDate.isBefore(localDate)) { final err = await upload(relativePath: relativePath); if (err != null) { errs.add(err); } - continue; + //_logger.info('local newer: $relativePath'); + return; } /// Remote is newer than local, so download remote @@ -147,12 +157,17 @@ class ICloud { if (err != null) { errs.add(err); } - } + //_logger.info('remote newer: $relativePath'); + })); + + await Future.wait(mission); return errs.isEmpty ? null : errs; } catch (e, s) { _logger.warning('Sync failed: $relativePaths', e, s); return [ICloudErr(type: ICloudErrType.generic, message: '$e')]; + } finally { + _logger.info('Sync finished.'); } } } diff --git a/lib/data/provider/app.dart b/lib/data/provider/app.dart index 95a3d763..77f46d12 100644 --- a/lib/data/provider/app.dart +++ b/lib/data/provider/app.dart @@ -3,11 +3,10 @@ import 'package:flutter/material.dart'; class AppProvider extends ChangeNotifier { int? _newestBuild; int? get newestBuild => _newestBuild; - - bool moveBg = true; - - void setNewestBuild(int build) { + set newestBuild(int? build) { _newestBuild = build; notifyListeners(); } + + bool moveBg = true; } diff --git a/lib/data/provider/server.dart b/lib/data/provider/server.dart index 1d7dee47..c8876d88 100644 --- a/lib/data/provider/server.dart +++ b/lib/data/provider/server.dart @@ -58,7 +58,10 @@ class ServerProvider extends ChangeNotifier { } else { _serverOrder.addAll(_servers.keys); } - _settingStore.serverOrder.put(_serverOrder); + // Must use [equals] to compare [Order] here. + if (!_serverOrder.equals(serverOrder_)) { + _settingStore.serverOrder.put(_serverOrder); + } _updateTags(); notifyListeners(); } diff --git a/lib/data/provider/snippet.dart b/lib/data/provider/snippet.dart index 29575a0a..8e34ef37 100644 --- a/lib/data/provider/snippet.dart +++ b/lib/data/provider/snippet.dart @@ -27,7 +27,9 @@ class SnippetProvider extends ChangeNotifier { finder: (n, name) => n.name == name, ); order.removeWhere((e) => surplus.any((ele) => ele == e)); - _setting.snippetOrder.put(order); + if (order != _setting.snippetOrder.fetch()) { + _setting.snippetOrder.put(order); + } } _addInternal(); _updateTags();