分享接收功能与代码清理

January 11, 2026
2 min read
By devshan

Table of Contents

This is a list of all the sections in this post. Click on any of them to jump to that section.

日期

2026-01-12

概述

实现 Android 系统分享接收功能,允许其他 App 分享文件到 StoreX,并进行代码清理优化。


分享接收功能

需求

  • 其他 App 可以通过系统分享菜单将文件分享给 StoreX
  • 分享后自动拉起文件夹选择器,可选择保存位置
  • 选择后文件自动添加到上传队列

实现方案

1. Android 端 (MainActivity.kt)

  • 在 AndroidManifest.xml 添加 intent-filter 接收 ACTION_SEND 和 ACTION_SEND_MULTIPLE
  • 处理分享 Intent 时,将 URI 复制到应用私有缓存目录(解决 URI 权限问题)
  • 通过 MethodChannel 传递文件路径给 Flutter 端
// 分享 Intent 处理流程
handleShareIntent(intent) {
    1. 从 Intent 提取 URI 列表
    2. 每个 URI 复制到 cacheDir/shared_files/
    3. 通过 shareChannel 通知 Flutter
}

2. Flutter 端

  • ShareService: 单例服务,监听原生端分享事件
  • 处理冷启动(getPendingFiles)和热启动(onShareReceived)两种场景
  • home_page.dart: 收到分享后显示文件夹选择器,上传到选定目录

关键设计决策

  • URI 复制到缓存: Android content:// URI 有权限限制,直接传路径不可靠,复制到私有目录确保 Flutter 可读取
  • 冷启动支持: App 未运行时接收分享,需要在 Flutter 初始化后主动查询 pendingFiles

代码清理

删除废弃代码 (app_state.dart)

  • setOffline(): 已废弃,改用 refreshHealthStatus 统一管理
  • loadCachedFiles(): 未被调用,离线加载已整合到 _loadFromLocalDb

合并重复代码 (home_page.dart)

  • _handleWidgetUpload_handleTrayUpload 完全相同
  • 提取为统一的 _pickAndUploadFiles() 方法

删除死代码

  • save_note 分支: NoteWidgetProvider 无对应 ACTION,属于遗留代码
  • _handleSaveNote(): 无调用入口
  • setShareCallback(): share_service.dart 中未使用的公开方法

文件变更

文件变更类型说明
AndroidManifest.xml修改添加分享 intent-filter
MainActivity.kt修改添加 shareChannel 和分享处理逻辑
share_service.dart新建分享接收服务
home_page.dart修改初始化分享服务、处理分享回调、合并重复代码
app_state.dart修改删除废弃方法

验证

  • flutter analyze: No issues found