【开源鸿蒙跨平台Flutter开发】AtomGit Pocket Tool:仓库详情与交互优化
·
一、阶段目标与实现总结
1.1 项目迭代背景
前几天完成了用户/仓库搜索以及我的仓库列表等基础功能,并实现了下拉刷新和上拉加载。今天主要是实现仓库详情查看功能。
最终实现:
- "我的仓库"页面:点击卡片查看详情页
- "搜索结果"页面:点击卡片显示仓库链接
二、核心实现详解
2.1 Repository模型的namespace处理
位置: lib/models/repository.dart
factory Repository.fromJson(Map<String, dynamic> json) {
final owner = json['owner'];
final namespace = json['namespace'];
String? ownerName;
String? ownerAvatarUrl;
String? namespacePath;
// 优先从namespace获取真实的仓库所有者信息
if (namespace is Map<String, dynamic>) {
ownerName = namespace['path']?.toString() ?? namespace['name']?.toString();
ownerAvatarUrl = namespace['avatar']?.toString();
namespacePath = namespace['path']?.toString();
}
// 如果namespace没有,则从owner获取
if (ownerName == null && owner is Map<String, dynamic>) {
ownerName = owner['login']?.toString() ?? owner['name']?.toString();
ownerAvatarUrl = owner['avatar_url']?.toString();
} else if (ownerName == null && owner is String) {
ownerName = owner;
ownerAvatarUrl = json['avatar_url']?.toString();
}
final fullName = json['full_name']?.toString() ??
json['path']?.toString() ??
json['name']?.toString() ?? '';
final name = json['name']?.toString() ?? '';
return Repository(
id: _parseInt(json['id']),
name: name,
fullName: fullName,
description: json['description']?.toString(),
htmlUrl: json['html_url']?.toString(),
language: json['language']?.toString(),
stargazersCount: _parseInt(json['stargazers_count']),
forksCount: _parseInt(json['forks_count']),
ownerName: ownerName,
ownerAvatarUrl: ownerAvatarUrl,
updatedAt: _parseDateTime(json['updated_at']),
namespacePath: namespacePath,
);
}
代码说明:
-
namespace优先策略:
- GitCode的搜索结果中,
owner字段通常是聚合账号(如coco_gitcode) - 真实的所有者信息在
namespace对象中 - 通过
namespace.path可以获取到如gh_mirrors这样的真实命名空间
- GitCode的搜索结果中,
-
降级处理:
- 如果没有namespace(如用户自己的仓库),则使用owner字段
- 支持owner是对象或字符串两种格式
2.2 搜索页的链接显示
位置: lib/main.dart - _SearchPageState
// 搜索结果列表构建
return ListView.builder(
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
itemCount: _repoResults.length,
itemBuilder: (context, index) {
final repo = _repoResults[index];
return RepositoryCard(
repository: repo,
onTap: () => _showLinkSnackBar(repo.htmlUrl, repo), // 显示链接
);
},
);
// 显示链接的方法
void _showLinkSnackBar(String? url, [Repository? repo]) {
final effectiveUrl = url ??
(repo?.fullName.isNotEmpty == true
? 'https://gitcode.com/${repo!.fullName}'
: null);
final text = effectiveUrl != null && effectiveUrl.isNotEmpty
? '仓库链接:$effectiveUrl'
: '无有效链接';
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(text),
duration: const Duration(seconds: 3),
),
);
}
2.3 API服务层
位置: lib/services/api_service.dart
/// 获取仓库详细信息
static Future<Map<String, dynamic>> getRepositoryDetail(String owner, String repo) async {
final url = Uri.parse('$baseUrl/repos/$owner/$repo');
final response = await _get(url);
if (response.statusCode == 200) {
final dynamic data = json.decode(response.body);
if (data is Map<String, dynamic>) {
return data;
}
throw Exception('Unexpected repository detail format.');
}
throw Exception('Failed to get repository detail: ${response.statusCode} - ${response.body}');
}
代码说明:
-
简洁的API设计:
- 接收两个参数:
owner和repo owner可以包含斜杠(如gh_mirrors/op)repo是纯粹的仓库名(如OpenManus)
- 接收两个参数:
-
URL构建:
- 直接拼接路径:
/api/v5/repos/{owner}/{repo} - 不需要URL编码,因为斜杠是路径的一部分
- 示例:
/api/v5/repos/username/my-repo或/api/v5/repos/ns/group/my-repo
- 直接拼接路径:
2.4 仓库详情页
位置: lib/pages/repository_detail_page.dart
详情页的代码保持原有设计,接收owner和repo参数,展示:
- 基本信息卡片(所有者、名称、描述、语言等)
- 统计数据卡片(Stars、Forks、Watchers、Issues)
- 时间信息卡片(创建、更新、推送时间)
- 其他信息卡片(分支、大小、功能开关)
三、体验优化
-
SnackBar提示:
- 位置:屏幕底部
- 持续时间:3秒
- 内容:完整的仓库链接
-
详情页加载:
- 加载中:显示圆形进度指示器
- 加载失败:显示错误图标和重试按钮
- 加载成功:平滑显示详情内容
四、后续优化方向
-
链接操作增强:
- 添加"复制链接"按钮到SnackBar
- 添加"在浏览器打开"按钮(如果系统支持)
-
详情页功能扩展:
- 添加README查看(
GET /repos/{owner}/{repo}/readme) - 添加Releases列表(
GET /repos/{owner}/{repo}/releases) - 添加分支列表(
GET /repos/{owner}/{repo}/branches)
- 添加README查看(
-
搜索结果优化:
- 添加筛选条件(语言、Stars数等)
- 支持排序(最新、最热、Stars最多)
五、测试结果
仓库详情页:


六、总结
经过多次迭代和问题解决,最终实现了:
- 仓库详情页
- 我的仓库查看详情,仓库搜索结果显示链接
写完这篇笔记已经挺迟了,明天继续加油!
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)