Flutter App 更新检查

160 阅读2分钟

方法功能分析

  1. checkUpdate()

    • 主要功能:检查应用更新
    • 特点:
      • 使用 _isUpdateDialogShowing 标志防止重复弹窗
      • 检查更新前清除定时器
      • 调用 UpdateService.checkUpdate() 执行实际更新检查
      • 完成后会重置标志并启动定时器
  2. _startUpdateTimer()

    • 主要功能:启动一个每5分钟检查一次的定时器
    • 特点:
      • 定时检查更新条件:
        • 应用没有处于暂停状态
        • 没有新更新待处理
        • 如果不满足条件则清除定时器
      • 如果不在首页但有新更新,设置 _hasNewUpdate 标志
  3. _endUpdateTimer()

    • 主要功能:取消现有的定时器

调用关系

  1. 初始调用链:

    •  onReady()  →  checkUpdate()  → 完成后调用 _startUpdateTimer() 
  2. 定时检查逻辑:

    •  _startUpdateTimer() 设置的定时器每分钟检查:
      • 如果在首页 → 直接调用 checkUpdate() 
      • 如果不在首页 → 只检查是否有更新但不弹窗,设置 _hasNewUpdate 标志
  3. 生命周期影响:

    • 应用回到前台( didChangeAppLifecycleState ) → 调用 checkUpdate() 
    • 应用暂停 → 定时器会跳过检查

调用时机总结

场景调用的方法
控制器初始化完成checkUpdate() → _startUpdateTimer()
每分钟定时检查根据条件可能调用checkUpdate()或只设置标志
应用从后台回到前台checkUpdate()
需要停止定时检查_endUpdateTimer()
路由变化到首页且有新更新checkUpdate()

设计意图分析

  1. 防重复弹窗:通过 _isUpdateDialogShowing 确保不会同时显示多个更新弹窗

  2. 智能检查:

    • 在首页时直接显示更新
    • 不在首页时只记录有更新,等回到首页再显示
  3. 性能考虑:

    • 应用暂停时停止检查
    • 使用定时器避免频繁检查
  4. 用户体验:

    • 不会在用户使用其他页面时突然弹出更新提示
    • 回到首页或定时检查时才会提示

这种设计实现了:

  • 定期检查更新
  • 合理的更新提示时机
  • 避免不必要的网络请求和用户打扰
  • 正确处理应用生命周期变化

流程图

---
config:
  theme: base
  look: handDrawn
  layout: dagre
---
flowchart TD
    A[RootController初始化] --> B[onReady]
    B --> C[调用checkUpdate]
    
    subgraph checkUpdate方法
    C --> D{_isUpdateDialogShowing?}
    D -->|否| E[设置为true]
    E --> E1[调用_endUpdateTimer]
    E1 --> F[执行UpdateService.checkUpdate]
    F --> G[重置标志为false]
    G --> H[设置_hasNewUpdate=false]
    H --> I[调用_startUpdateTimer]
    D -->|是| Z[直接返回]
    end
    
    subgraph _startUpdateTimer方法
    I --> J[创建每分钟触发的定时器]
    J --> K{定时器触发条件检查}
    K -->|应用暂停或已有更新| L[跳过本次检查]
    K -->|在首页| M[调用checkUpdate]
    K -->|不在首页| N[检查是否有新更新]
    N --> O{有更新?}
    O -->|是| P[设置_hasNewUpdate=true]
    O -->|否| Q[不做操作]
    end
    
    subgraph 其他触发路径
    R[应用回到前台] --> C
    S[路由变化到首页且有新更新] --> C
    T[控制器关闭]
    end
    
    subgraph _endUpdateTimer方法
    E1 --> V[取消现有定时器]
    L --> V
    T --> V
    end