Flutter GitHub Issues管理插件github_issues的使用
Flutter GitHub Issues管理插件github_issues的使用
简介
github_issues
是一个用于管理 GitHub Issues 的 Flutter 插件。它允许开发者通过应用收集用户反馈,并将其直接提交到 GitHub 仓库中。该插件支持两种认证方式,并且提供了本地化的支持。

特性
- 可以创建带有标题、评论和标签的 GitHub Issues。
- 提供了简单的国际化支持(通过
GithubIssuesLocalizations
)。 - 支持两种认证方式:
- 使用个人访问令牌(Personal Access Token)。
- 使用 GitHub 应用程序(GitHub App)进行认证。
开始使用
第一步:创建一个存储用户反馈的仓库
- 创建一个新的 GitHub 仓库,或者使用现有的仓库来存储用户反馈。
第二步:获取认证令牌
为了访问和操作 Issues,你需要一个具有读写权限的令牌。以下是两种获取令牌的方法:
方法 1:生成个人访问令牌(Personal Access Token)
- 登录你的 GitHub 账户。
- 访问 GitHub Personal Access Token 页面。
- 创建一个新的令牌,确保勾选
repo
权限(可以读取和写入 Issues)。
方法 2:创建 GitHub 应用程序
- 注册一个新的 GitHub 应用程序(GitHub App 注册页面)。
- 安装该应用程序到目标仓库。
- 为应用程序生成一个私钥(GitHub App 私钥生成页面)。
使用示例
基本使用
以下是一个基本的使用示例,展示如何通过弹窗让用户输入反馈并提交到 GitHub:
showDialog(
context: context,
builder: (context) {
return GithubIssueDialog(
github: Github(Authentication.token('PERSONAL_ACCESS_TOKEN')), // 替换为你的个人访问令牌
owner: 'OWNER', // 仓库所有者
repo: 'REPO', // 仓库名称
initialValue: const IssueRequest(title: "Hello World!"), // 默认值
);
},
);
自定义本地化
如果你希望修改弹窗的标题或提示信息,可以通过自定义本地化类实现:
class CustomLocalization extends GithubIssuesLocalizationsEn {
[@override](/user/override)
String get dialogTitle => '感谢您的反馈!'; // 修改弹窗标题
}
showDialog(
context: context,
builder: (context) {
return GithubIssueDialog(
github: Github(Authentication.token('PERSONAL_ACCESS_TOKEN')),
owner: 'OWNER',
repo: 'REPO',
localizations: CustomLocalization(), // 使用自定义本地化
);
},
);
隐藏标题输入框
如果你想只允许用户输入评论,而隐藏标题字段,可以设置 showTitle
属性为 false
:
showDialog(
context: context,
builder: (context) {
return GithubIssueDialog(
github: Github(Authentication.token('PERSONAL_ACCESS_TOKEN')),
owner: 'OWNER',
repo: 'REPO',
showTitle: false, // 隐藏标题输入框
labels: null, // 不显示标签
initialValue: const IssueRequest(title: "Hidden Title"), // 必须提供一个默认标题
);
},
);
自定义标签
你也可以在弹窗中添加自定义标签:
showDialog(
context: context,
builder: (context) {
return GithubIssueDialog(
github: Github(Authentication.token('PERSONAL_ACCESS_TOKEN')),
owner: 'OWNER',
repo: 'REPO',
labels: [
Label.custom(
name: 'bug', // 标签名称
color: colorToRadixString(Colors.red.shade600), // 标签颜色
),
Label.custom(
name: 'documentation', // 标签名称
color: colorToRadixString(Colors.blue.shade600), // 标签颜色
),
],
);
},
);
// 辅助方法:将颜色转换为十六进制字符串
String colorToRadixString(Color color) {
return color.value.toRadixString(16); // 将颜色转换为十六进制表示
}
完整示例代码
以下是一个完整的示例代码,展示了如何在 Flutter 中集成 github_issues
插件:
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:github_issues/github_issues.dart';
const kOwner = 'abichinger'; // 仓库所有者
const kRepo = 'github-issues-test'; // 仓库名称
late Github github;
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final token = await personalToken; // 获取个人访问令牌
github = Github(Authentication.token(token)); // 初始化 GitHub 实例
runApp(const GithubIssuesExampleApp());
}
Future<String> get personalToken {
return rootBundle.loadString('assets/token.txt'); // 从 assets 文件中加载令牌
}
class GithubIssuesExampleApp extends StatelessWidget {
const GithubIssuesExampleApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
themeMode: ThemeMode.light,
theme: ThemeData(useMaterial3: true),
darkTheme: ThemeData.dark(useMaterial3: true),
home: const GithubIssuesExample(),
);
}
}
class GithubIssuesExample extends StatelessWidget {
const GithubIssuesExample({super.key});
String colorToRadixString(Color color) {
return color.value.toRadixString(16); // 将颜色转换为十六进制字符串
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Github Issues - Example'),
),
body: Center(
child: Column(
children: [
const SizedBox(height: 30),
ElevatedButton(
onPressed: () {
showDialog(
context: context,
builder: (context) {
return GithubIssueDialog(
github: github,
owner: kOwner,
repo: kRepo,
initialValue: const IssueRequest(title: "Hello World!"),
);
},
);
},
child: const Text('Give Feedback!'), // 给出反馈
),
const SizedBox(height: 12),
ElevatedButton(
onPressed: () {
showDialog(
context: context,
builder: (context) {
return GithubIssueDialog(
github: github,
owner: kOwner,
repo: kRepo,
initialValue: const IssueRequest(title: "Hello World!"),
labels: null, // 隐藏标签
);
},
);
},
child: const Text('Feedback (labels hidden)'), // 隐藏标签
),
const SizedBox(height: 12),
ElevatedButton(
onPressed: () {
showDialog(
context: context,
builder: (context) {
return GithubIssueDialog(
github: github,
owner: kOwner,
repo: kRepo,
showTitle: false, // 隐藏标题输入框
labels: null,
initialValue: const IssueRequest(title: "Hidden Title"), // 必须提供一个默认标题
);
},
);
},
child: const Text('Feedback (Only comment)'), // 只输入评论
),
const SizedBox(height: 12),
ElevatedButton(
onPressed: () {
showDialog(
context: context,
builder: (context) {
return GithubIssueDialog(
github: github,
owner: kOwner,
repo: kRepo,
localizations: CustomLocalization(), // 自定义本地化
);
},
);
},
child: const Text('Feedback (Custom localization)'), // 自定义本地化
),
const SizedBox(height: 12),
ElevatedButton(
onPressed: () {
showDialog(
context: context,
builder: (context) {
return GithubIssueDialog(
github: github,
owner: kOwner,
repo: kRepo,
labels: [
Label.custom(
name: 'bug',
color: colorToRadixString(Colors.red.shade600), // 自定义标签颜色
),
Label.custom(
name: 'documentation',
color: colorToRadixString(Colors.blue.shade600), // 自定义标签颜色
),
],
);
},
);
},
child: const Text('Feedback (hardcoded labels)'), // 固定标签
),
],
),
),
);
}
}
class CustomLocalization extends GithubIssuesLocalizationsEn {
[@override](/user/override)
String get dialogTitle => '感谢您的反馈!'; // 修改弹窗标题
}
更多关于Flutter GitHub Issues管理插件github_issues的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter GitHub Issues管理插件github_issues的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
github_issues
是一个用于在 Flutter 应用中管理 GitHub Issues 的插件。它允许你与 GitHub API 进行交互,获取、创建、更新和关闭 Issues。以下是如何使用 github_issues
插件的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 github_issues
插件的依赖:
dependencies:
flutter:
sdk: flutter
github_issues: ^0.0.1 # 请检查最新版本
然后运行 flutter pub get
来安装依赖。
2. 导入插件
在你的 Dart 文件中导入 github_issues
插件:
import 'package:github_issues/github_issues.dart';
3. 初始化 GitHub Issues 客户端
你需要使用你的 GitHub 个人访问令牌(Personal Access Token)来初始化 GitHubIssues
客户端。你可以在 GitHub 的开发者设置中生成一个访问令牌。
final githubIssues = GitHubIssues(
token: 'your_github_personal_access_token',
);
4. 获取 Issues
你可以使用 getIssues
方法来获取指定仓库的 Issues:
final issues = await githubIssues.getIssues(
owner: 'flutter',
repo: 'flutter',
state: 'open', // 可以是 'open', 'closed', 或 'all'
);
for (var issue in issues) {
print('Issue #${issue.number}: ${issue.title}');
}
5. 创建 Issue
你可以使用 createIssue
方法来创建一个新的 Issue:
final newIssue = await githubIssues.createIssue(
owner: 'flutter',
repo: 'flutter',
title: 'New Issue Title',
body: 'This is the body of the new issue.',
labels: ['bug', 'enhancement'],
);
print('Created Issue #${newIssue.number}');
6. 更新 Issue
你可以使用 updateIssue
方法来更新一个现有的 Issue:
final updatedIssue = await githubIssues.updateIssue(
owner: 'flutter',
repo: 'flutter',
issueNumber: 123, // 要更新的 Issue 编号
title: 'Updated Issue Title',
body: 'This is the updated body of the issue.',
state: 'closed', // 可以是 'open' 或 'closed'
);
print('Updated Issue #${updatedIssue.number}');
7. 关闭 Issue
你可以使用 closeIssue
方法来关闭一个 Issue:
final closedIssue = await githubIssues.closeIssue(
owner: 'flutter',
repo: 'flutter',
issueNumber: 123, // 要关闭的 Issue 编号
);
print('Closed Issue #${closedIssue.number}');
8. 处理错误
在使用 github_issues
插件时,可能会遇到各种错误(如网络错误、认证错误等)。你可以使用 try-catch
块来捕获并处理这些错误:
try {
final issues = await githubIssues.getIssues(
owner: 'flutter',
repo: 'flutter',
state: 'open',
);
} catch (e) {
print('Error: $e');
}