You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter闪卡应用:本地与服务器数据迁移及合并展示最佳实践

本地与网络词汇数据合并展示的最佳实践

1. 给数据打标识,做好基础分类

给每条词汇添加来源标记(比如local/server)和唯一ID,同时加last_modified字段记录最后修改时间:

  • 本地自定义词汇用本地生成的UUID或自增ID,服务器词汇直接用后端返回的唯一ID
  • 不管是本地编辑还是服务器更新,都同步更新last_modified,这是后续冲突判断的核心依据

2. 先展示本地,再后台同步补全

  • 应用启动时优先加载本地数据库,快速展示用户的自定义词汇,避免空白等待,保障基础体验
  • 后台异步请求服务器数据,拿到数据后再做合并操作:
    • 服务器新词汇(本地无对应ID):直接加入数据集
    • ID重复的词汇:对比last_modified,谁更新晚就用谁的版本;如果是本地和服务器都做了修改,给用户弹窗确认选择保留版本

3. 高效合并的实现逻辑

用**哈希表(字典)**做快速匹配,避免循环遍历的低效:

# 本地数据转成ID为键的字典
local_vocabs = {vocab.id: vocab for vocab in get_local_vocabs()}
# 请求服务器数据
server_vocabs = fetch_server_vocabs()

# 合并逻辑:优先保留本地,再根据时间戳更新/添加服务器数据
for vocab in server_vocabs:
    if vocab.id in local_vocabs:
        # 服务器版本更新更晚,替换本地数据
        if vocab.last_modified > local_vocabs[vocab.id].last_modified:
            local_vocabs[vocab.id] = vocab
    else:
        # 新增服务器词汇
        local_vocabs[vocab.id] = vocab

# 转成列表用于展示,可按用户习惯排序(如添加时间、字母顺序)
merged_vocabs = list(local_vocabs.values())

4. 冲突处理要人性化

  • 对于本地和服务器都修改过的词汇,不要直接覆盖:展示两边的差异(比如本地释义VS服务器释义),给用户三个选项:保留本地、保留服务器、手动编辑合并
  • 允许用户标记部分本地词汇为**「不参与服务器同步」**,这类词汇永远优先展示本地版本,不被服务器数据覆盖

5. 展示层的状态提示

  • 同步中:在页面边缘显示弱提示(比如「正在同步服务器词汇...」),不遮挡核心内容
  • 同步完成:短暂提示「新增X个词汇,更新Y个词汇」,让用户感知变化
  • 网络异常:提示「无法同步服务器数据,当前仅展示本地词汇」,并提供重试按钮

6. 合并后持久化更新本地数据

把最终合并后的数据集更新到本地数据库,下次启动直接加载最新合并数据,无需重复合并(除非用户主动触发同步)

内容的提问来源于stack exchange,提问作者dokind

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 07:15:41