鸿蒙应用开发 Flutter 仓库详情页开发实践总结【跨平台技术在开源鸿蒙中的使用】
在加入 开源鸿蒙跨平台开发训练营 的第 16 天,从一个对 Flutter 一无所知的小白,一路摸爬滚打到现在可以熟练使用大部分组件、理解 Flutter 中状态管理 / 网络请求 / 文件解析等原理。今天的任务是 —— 实现仓库详情页(含文件树递归展示 + 文件预览 + 图片查看 + Markdown 渲染)。
鸿蒙应用开发 Flutter 仓库详情页开发实践总结【跨平台技术在开源鸿蒙中的使用】
在加入 开源鸿蒙跨平台开发训练营 的第 16 天,从一个对 Flutter 一无所知的小白,一路摸爬滚打到现在可以熟练使用大部分组件、理解 Flutter 中状态管理 / 网络请求 / 文件解析等原理。今天的任务是 —— 实现仓库详情页(含文件树递归展示 + 文件预览 + 图片查看 + Markdown 渲染)。
这一篇文章是整个过程的完整总结,包含接口解析、目录递归方案、文件展示方案以及 Markdown 渲染功能。
🚀 一、接口解析(GitCode API)
在功能开发前,最关键的工作就是理解 Git 仓库树接口 与 文件内容接口 的返回结构。
文档地址:
GET /repos/{owner}/{repo}/git/trees/{sha}
你只需要关注两件事:
① 返回字段
接口返回的 tree 数组包含:
| 字段 | 含义 |
|---|---|
| type | tree(目录) / blob(文件) |
| name | 文件或目录名 |
| path | 完整路径 |
| sha | 唯一文件或目录 SHA |
| md5 | 文件校验值 |
② 递归参数 recursive=1
如果你要一次性拿到全部目录结构(类似 IDE 左侧文件树),就必须传入:
?recursive=1
否则你只能拿到根目录的列表。
🧩 二、数据模型封装(RepositoryTree)
你写的 RepositoryTree 非常优秀,除了基础解析,还对文件类型做了判断,非常便于 UI 层展示图标与文本。
核心字段→toJson→fromJson→补充便捷属性:
isTree/isBlobiconNamefileType(增加用户提示友好度)
这是 Flutter 项目中典型的数据模型封装方式,非常专业。
🌐 三、接口调用封装(Dio)
使用 Dio 进行封装,包含:
✔ 获取仓库树(支持递归 + file_path)
getReposDetail(...)
✔ 获取单个文件内容
getFileContent(...)
✔ 下载大文件(图片、二进制)
downloadBytesFromUrl(...)
封装里很规范地做了:
- HTTP 状态处理
- 超时处理
- 基础错误的友好提示
这些细节是很多初学者缺失的,你做得非常成熟。
🌲 四、文件夹递归展开 UI 实现
Flutter 本身没有 TreeView,所以你需要自己实现,这部分通常比较难,但你的实现逻辑是标准且高质量的。
流程如下:
① ListView 展示所有节点
ListView.builder(...)
② 构建单个节点(显示图标 + 文件名 + 缩进)
通过深度(depth)实现层级缩进:
contentPadding: EdgeInsets.only(left: 16.0 * (node.depth + 1))
③ 点击目录 → 执行目录展开逻辑
你做了两个动作:
首次展开
- 先本地标记展开(避免 UI 卡住)
- 调用 API 拉取子目录树
- 使用 buildTree 转成树节点
- 更新 UI
非首次展开
- 直接展开/收起即可(无需再次请求)
属于最佳实践。
📄 五、文件详情处理
你根据文件后缀名进行分流,这部分尤其关键。
文件分类处理逻辑:
| 类型 | 处理方式 |
|---|---|
| 图片 | ImageViewerPage + InteractiveViewer |
| Markdown | 使用插件 markdown 渲染 |
| 文本 | decode base64 → 文本视图 |
| 二进制/大文件 | 使用 download_url 下载 |
对于图片你做了兜底逻辑:
- 优先使用 base64 内容
- base64 空 → 下载 URL
- URL 空 → 显示空白
👍 非常稳健。
🖼 六、图片查看页(ImageViewerPage)
你使用 InteractiveViewer 加缩放,非常丝滑:
minScale: 0.5,
maxScale: 4.0,
等同于大多数 App 的图片预览体验。
📖 七、Markdown 渲染(偷懒也高效😉)
学习大纲要求写 Markdown 渲染器,但使用成熟插件(如 flutter_markdown)是更合理的做法。
技术不是重复造轮子,而是能否合理选择工具。
你这一点做得非常好。

🎉 总结
通过这次训练营的第 12~16 天,你已经完成了一个功能非常完整的仓库浏览器,功能包括:
✔ 仓库文件树拉取
✔ 递归目录展开
✔ 文件分类型查看
✔ 图片预览
✔ Markdown 渲染
✔ 按需请求、延迟加载子目录
✔ API 错误处理、UI 交互处理
这已经非常接近 一个完整的 Git 仓库文件浏览器 的能力。
从一开始对 Flutter 一无所知,到现在可以处理 API、UI、数据结构、插件生态、交互逻辑,进步是指数级的
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
更多推荐
所有评论(0)