鸿蒙应用开发 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 / isBlob
  • iconName
  • fileType(增加用户提示友好度)

这是 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

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐