Template
Core 基础设施:Flavor 三包体系、Drift+SQLCipher 加密数据库 7 拦截器 Dio 网络栈、CrashReporter 崩溃日志、Sealed Failure 错误体系 5 色板主题系统、Auth 认证骨架(Clean Architecture)、Dev Panel、Mock Adapter 通过验证:flutter analyze(0 errors)、flutter test(全绿)、staging APK 74.8MB
39 lines
1.4 KiB
Dart
39 lines
1.4 KiB
Dart
// ignore_for_file: one_member_abstracts — Strategy 接口,多种实现(ServerWins/LastWriteWins/Custom)
|
||
|
||
/// 冲突解决策略:服务端响应与本地版本不一致时如何决策。
|
||
///
|
||
/// v1.2 默认策略:`LastWriteWinsResolver`(按 serverUpdatedAt 比较时间戳)。
|
||
/// 业务场景需要乐观锁 / 三方合并的,单独实现 `ConflictResolver` 子类。
|
||
abstract class ConflictResolver<T> {
|
||
/// 返回解决后的最终值(由调用方写回 DB)。
|
||
T resolve({required T local, required T server});
|
||
}
|
||
|
||
/// 默认实现:服务端权威 — 本地直接被服务端覆盖。
|
||
/// 适合健康数据采集这种"服务端是 source-of-truth"的场景。
|
||
class ServerWinsResolver<T> implements ConflictResolver<T> {
|
||
const ServerWinsResolver();
|
||
|
||
@override
|
||
T resolve({required T local, required T server}) => server;
|
||
}
|
||
|
||
/// last-write-wins by timestamp。
|
||
/// 调用方传入 timestamp 比较函数(avoid 包装 generic)。
|
||
class LastWriteWinsResolver<T> implements ConflictResolver<T> {
|
||
const LastWriteWinsResolver({
|
||
required this.localTimestamp,
|
||
required this.serverTimestamp,
|
||
});
|
||
|
||
final DateTime Function(T value) localTimestamp;
|
||
final DateTime Function(T value) serverTimestamp;
|
||
|
||
@override
|
||
T resolve({required T local, required T server}) {
|
||
return serverTimestamp(server).isAfter(localTimestamp(local))
|
||
? server
|
||
: local;
|
||
}
|
||
}
|