news 2026/7/7 20:57:01

开源鸿蒙跨平台开发训练营--AtomGit(GitCode)口袋工具(六)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
开源鸿蒙跨平台开发训练营--AtomGit(GitCode)口袋工具(六)

获取代码仓库文件列表

如下图所示:我们先实现从网络获取文件列表的接口

该接口会返回文件列表集合。实例数据如下所示:

[ .gitignore, ArkTSCangjieHybridApp/.gitignore, ArkTSCangjieHybridApp/AppScope/resources/base/element/string.json, ArkTSCangjieHybridApp/AppScope/resources/base/media/app_icon.png, ArkTSCangjieHybridApp/README.md, ArkTSCangjieHybridApp/arkts_modules/shortvideoarkts/.gitignore, ArkTSCangjieHybridApp/arkts_modules/shortvideoarkts/Index.ets, ArkTSCangjieHybridApp/arkts_modules/shortvideoarkts/oh-package.json5, ]

1. 数据处理

首先我们需要创建一个GitCodeCodeRepo实体类,用来表示文件或者文件夹。根据上述返回的是数据列表,我们需要将每个文件、文件夹转换成对应的GitCodeCodeRepo实体类。所以我们需要做数据转换,将对应的字符串列表,转换成List<GitCodeCodeRepo>

GitCodeCodeRepo我们先设计三个属性,如下所示:

  • name:文件名/文件夹名。
  • path:文件夹/文件的完整路径。
  • isDir: 是否是文件夹。
class GitCodeCodeRepo { final String name; // 文件名或文件夹名 final bool isDir; // 是否为文件夹 final String? path; // 完整路径 GitCodeCodeRepo({ required this.name, required this.isDir, this.path, }); }

然后我们在GitCodeCodeRepo中新建一个buildTreeFromPaths函数,专门用来解析数据,目的是将List<String>转换成List<GitCodeCodeRepo>。代码如下所示:

static List<GitCodeCodeRepo> buildTreeFromPaths(List<String> paths) { final List<GitCodeCodeRepo> rootNodes = []; // 遍历接口返回的所有文件路径 for (final path in paths) { // 将每个路径按照 "/" 进行分割。 final parts = path.split('/').where((part) => part.isNotEmpty).toList(); if (parts.isEmpty) continue; for (int i = 0; i < parts.length; i++) { // 获取文件名 String fileName = parts[i]; // 判断是不是文件夹 bool isDir = fileName.contains("."); GitCodeCodeRepo repo = GitCodeCodeRepo(name: fileName, isDir: isDir); rootNodes.add(repo); } } return rootNodes; }

文件和文件夹虽然显示出来了,但是我们发现数据有问题:所有的文件和文件夹都平铺在这个列表里,没有文件夹层次结构了。‘

因此我们继续修改,并且让当前列表只展示根目录下的文件或文件夹。

static List<GitCodeCodeRepo> buildTreeFromPathsTest(List<String> paths) { final Map<String, GitCodeCodeRepo> nodeMap = {}; final List<GitCodeCodeRepo> rootNodes = []; // 遍历接口返回的所有文件路径 for (final path in paths) { // 将每个路径按照 "/" 进行分割。 final parts = path.split('/').where((part) => part.isNotEmpty).toList(); if (parts.isEmpty) continue; String currentPath = ''; for (int i = 0; i < parts.length; i++) { final part = parts[i]; final isLastPart = i == parts.length - 1; // 这里修改了判断文件夹的逻辑 final isDir = isLastPart ? path.endsWith('/') : true; currentPath += '/$part'; // 对于文件夹,确保路径以斜杠结尾 final nodePath = isDir ? '$currentPath/' : currentPath; if (!nodeMap.containsKey(nodePath)) { final node = GitCodeCodeRepo( name: part, isDir: isDir, path: nodePath, ); nodeMap[nodePath] = node; // 如果是根节点(第一级),添加到根节点列表 if (i == 0) { rootNodes.add(node); } } } } return rootNodes; }

说明:为了提高用户体验,区分不同的 item。我们对每个 item 进行各行设置不同的背景色。

根目录显示成功,我们可以继续再优化一下。当前处理后的列表中,文件夹和文家是乱序的,我们需要将文件夹和文件进行排序,如果相同类型的文件或文件夹,则按照字母顺序排序。

// 在该函数中, return List 之前,先进行排序 rootNodes.sort((a, b) { // 文件夹排在前面 if (a.isDir && !b.isDir) return -1; if (!a.isDir && b.isDir) return 1; // 同类型按名称字母顺序排序 return a.name.compareTo(b.name); });

2. 界面跳转

当我们点击 item 后跳转到文件详情界面。目前先展示一些基本信息。文件具体的内容暂时先不展示。

// 点击跳转 Navigator.push( context, MaterialPageRoute( builder: (context) => ShowCodeDetailPage( repo: widget.repo, refName: refName, filePath: fullPath, node: node, fileTree: _fileTree, // 传递_fileTree数据 ), ), );

在文件详情界面我们展示一些基本信息,用于验证文件的正确性。如下图所示:仓库、分支正确,而且最重要的文件路径也显示正确。

3. 侧边栏实现

由于文件夹和文件列表以及文件具体内容展示区域都非常占用空间,所以我们将文件夹和文件列表使用侧边栏来展示,并且侧边栏是悬浮状态。而且由于我们将处理过后的文件列表数据传递过去了,也顺便在侧边栏中展示出来。

核心区域我们做一个判断,如果用户点击的 item 是文件夹进入当前页面,则核心区域不展示内容。如果用户点击的是 item 是文件,则展示当前文件内容(先不实现)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 22:43:36

从开发转到安全渗透工程师,是我做的最对的决定

开发是我不想重复的路 早几年都流行学计算机&#xff0c;传言就业薪资高&#xff0c;就选了软件开发专业。 在学校也不算混子吧&#xff0c;该学的java、python、前端操作系统都学了&#xff0c;不过大学的基础大家都懂&#xff0c;大学期间贪玩&#xff0c;老师在上面讲课&a…

作者头像 李华
网站建设 2026/7/1 19:59:54

60亿消息表如何分库分表?

引言“运营给了半年规划 ——DAU 要冲 30 万&#xff0c;到时候每天的对话消息量估计得超 5 千万&#xff0c;现在这张 message 表撑不住啊&#xff01;”周一的技术评审会上&#xff0c;后端组长老张说&#xff1a;当前 message 表数据量不到 9 千万&#xff0c;但按日增 5 千…

作者头像 李华
网站建设 2026/7/5 16:01:32

干货分享,大厂内部压测方案设计

01 为什么要做压测 1、什么是压力测试&#xff1f; 不断向被测对象施加压力&#xff0c;测试系统在压力情况下的表现。 2、压力测试的目的是什么&#xff1f; 测试得出系统的极限性能指标&#xff0c;从而给出合理的承诺值或者容量告警&#xff1b; 找出系统的性能瓶颈&am…

作者头像 李华
网站建设 2026/7/3 14:35:27

Python_work3

使用os和os.path以及函数的递归完成: 给出一个路径&#xff0c;遍历当前路径所有的文件及文件夹 打印输出所有的文件&#xff08;遇到文件输出路径&#xff0c;遇到文件夹继续进文件夹&#xff09;代码 import os.path as path import os file_path_dir "E:\\A云计算\\2…

作者头像 李华
网站建设 2026/7/7 6:36:17

AFLplusplus模糊测试实战:10个高效调试技巧解决常见问题

AFLplusplus作为业界领先的模糊测试框架&#xff0c;在软件质量保障中发挥着关键作用。然而在实际应用中&#xff0c;许多用户会遇到执行效率低下、崩溃分析困难、路径覆盖不足等挑战。本文将通过10个实用技巧&#xff0c;帮助你快速定位并解决这些模糊测试难题。 【免费下载链…

作者头像 李华
网站建设 2026/7/7 19:44:22

探索三电平T型LCL并网逆变器的双闭环PI + SVPWM控制仿真之旅

基于三电平T型LCL并网逆变器的双闭环PISVPWM控制 Matlab/simulink仿真(2018a及以上版本)&#xff0c;在电力电子领域&#xff0c;逆变器控制技术一直是研究的热门方向。今天咱就来唠唠基于三电平T型LCL并网逆变器的双闭环PI SVPWM控制&#xff0c;并且借助Matlab/Simulink&…

作者头像 李华