This commit is contained in:
lollipopkit
2023-09-11 23:23:46 +08:00
parent 932a9ef3ff
commit 730a62831b
6 changed files with 47 additions and 18 deletions

View File

@@ -81,4 +81,14 @@ extension OrderX<T> on Order<T> {
addAll(missed); addAll(missed);
return surplus; return surplus;
} }
/// Dart uses memory address to compare objects by default.
/// This method compares the values of the objects.
bool equals(Order<T> other) {
if (length != other.length) return false;
for (var i = 0; i < length; i++) {
if (this[i] != other[i]) return false;
}
return true;
}
} }

View File

@@ -39,7 +39,7 @@ Future<void> doUpdate(BuildContext context, {bool force = false}) async {
return; return;
} }
locator<AppProvider>().setNewestBuild(newest); locator<AppProvider>().newestBuild = newest;
if (!force && newest <= BuildData.build) { if (!force && newest <= BuildData.build) {
_logger.info('Update ignored due to current: ${BuildData.build}, ' _logger.info('Update ignored due to current: ${BuildData.build}, '

View File

@@ -103,23 +103,26 @@ class ICloud {
final errs = <ICloudErr>[]; final errs = <ICloudErr>[];
final allFiles = await getAll(); final allFiles = await getAll();
// remove files not in relativePaths /// remove files not in relativePaths
allFiles.removeWhere((e) => !relativePaths.contains(e.relativePath)); allFiles.removeWhere((e) => !relativePaths.contains(e.relativePath));
// upload files not in iCloud final mission = <Future<void>>[];
/// upload files not in iCloud
final missed = relativePaths.where((e) { final missed = relativePaths.where((e) {
return !allFiles.any((f) => f.relativePath == 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); final err = await upload(relativePath: e);
if (err != null) { if (err != null) {
errs.add(err); errs.add(err);
} }
} //_logger.info('upload missed: $e');
}));
final docPath = await docDir; final docPath = await docDir;
// compare files in iCloud and local /// compare files in iCloud and local
for (final file in allFiles) { mission.addAll(allFiles.map((file) async {
final relativePath = file.relativePath; final relativePath = file.relativePath;
/// Check date /// Check date
@@ -130,16 +133,23 @@ class ICloud {
if (err != null) { if (err != null) {
errs.add(err); errs.add(err);
} }
continue; //_logger.info('local not found: $relativePath');
return;
} }
final localDate = await localFile.lastModified(); final localDate = await localFile.lastModified();
if (file.contentChangeDate.isBefore(localDate)) { final remoteDate = file.contentChangeDate;
/// Same date, skip
if (remoteDate.difference(localDate) == Duration.zero) return;
/// Local is newer than remote, so upload local file /// Local is newer than remote, so upload local file
if (remoteDate.isBefore(localDate)) {
final err = await upload(relativePath: relativePath); final err = await upload(relativePath: relativePath);
if (err != null) { if (err != null) {
errs.add(err); errs.add(err);
} }
continue; //_logger.info('local newer: $relativePath');
return;
} }
/// Remote is newer than local, so download remote /// Remote is newer than local, so download remote
@@ -147,12 +157,17 @@ class ICloud {
if (err != null) { if (err != null) {
errs.add(err); errs.add(err);
} }
} //_logger.info('remote newer: $relativePath');
}));
await Future.wait(mission);
return errs.isEmpty ? null : errs; return errs.isEmpty ? null : errs;
} catch (e, s) { } catch (e, s) {
_logger.warning('Sync failed: $relativePaths', e, s); _logger.warning('Sync failed: $relativePaths', e, s);
return [ICloudErr(type: ICloudErrType.generic, message: '$e')]; return [ICloudErr(type: ICloudErrType.generic, message: '$e')];
} finally {
_logger.info('Sync finished.');
} }
} }
} }

View File

@@ -3,11 +3,10 @@ import 'package:flutter/material.dart';
class AppProvider extends ChangeNotifier { class AppProvider extends ChangeNotifier {
int? _newestBuild; int? _newestBuild;
int? get newestBuild => _newestBuild; int? get newestBuild => _newestBuild;
set newestBuild(int? build) {
bool moveBg = true;
void setNewestBuild(int build) {
_newestBuild = build; _newestBuild = build;
notifyListeners(); notifyListeners();
} }
bool moveBg = true;
} }

View File

@@ -58,7 +58,10 @@ class ServerProvider extends ChangeNotifier {
} else { } else {
_serverOrder.addAll(_servers.keys); _serverOrder.addAll(_servers.keys);
} }
// Must use [equals] to compare [Order] here.
if (!_serverOrder.equals(serverOrder_)) {
_settingStore.serverOrder.put(_serverOrder); _settingStore.serverOrder.put(_serverOrder);
}
_updateTags(); _updateTags();
notifyListeners(); notifyListeners();
} }

View File

@@ -27,8 +27,10 @@ class SnippetProvider extends ChangeNotifier {
finder: (n, name) => n.name == name, finder: (n, name) => n.name == name,
); );
order.removeWhere((e) => surplus.any((ele) => ele == e)); order.removeWhere((e) => surplus.any((ele) => ele == e));
if (order != _setting.snippetOrder.fetch()) {
_setting.snippetOrder.put(order); _setting.snippetOrder.put(order);
} }
}
_addInternal(); _addInternal();
_updateTags(); _updateTags();
} }