mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 15:24:35 +01:00
#157 opt.
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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}, '
|
||||||
|
|||||||
@@ -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.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user