Flutter GitHub集成插件github_kit的使用

发布于 1周前 作者 eggper 来自 Flutter

Flutter GitHub集成插件github_kit的使用

GitHubKit 是一个全面的 Dart 包,用于与 GitHub API 交互。它提供了易于使用的接口来执行常见的 GitHub 操作,并支持高级功能,如 GitHub Actions、代码扫描和秘密扫描。

目录

特性

  • 完整覆盖 GitHub REST API v3
  • 支持 GitHub GraphQL API v4
  • 仓库管理
  • 问题和拉取请求处理
  • GitHub Actions 工作流管理
  • 代码扫描和秘密扫描 API
  • 自动分页处理
  • 内置速率限制处理和自动重试
  • 全面的日志系统
  • 带有自定义异常的简单错误处理
  • 完整的认证支持(个人访问令牌)
  • 丰富的文档和示例

安装

在你的包的 pubspec.yaml 文件中添加以下依赖项:

dependencies:
  github_kit: ^1.0.0

然后运行:

$ dart pub get

使用

初始化

首先,导入包并创建 GitHubKit 的实例:

import 'package:github_kit/github_kit.dart';

final gitHubKit = GitHubKit(token: 'your_personal_access_token');

仓库管理

获取仓库:

// 获取仓库
final repo = await gitHubKit.repositories.getRepository('octocat', 'Hello-World');
print('Repository: ${repo.fullName}');

创建仓库:

// 创建仓库
final newRepo = await gitHubKit.repositories.createRepository('New-Repo', private: true);
print('Created new repository: ${newRepo.fullName}');

列出仓库:

// 列出仓库
final repos = await gitHubKit.repositories.listRepositories('octocat');
for (var repo in repos) {
  print('Repo: ${repo.name}');
}

问题处理

创建问题:

// 创建问题
final issue = await gitHubKit.issues.createIssue('octocat', 'Hello-World', 'Bug report', body: 'This is a bug report');
print('Created issue #${issue.number}');

获取问题:

// 获取问题
final fetchedIssue = await gitHubKit.issues.getIssue('octocat', 'Hello-World', 1);
print('Issue title: ${fetchedIssue.title}');

列出问题:

// 列出问题
final issues = await gitHubKit.issues.listIssues('octocat', 'Hello-World', state: 'open');
for (var issue in issues) {
  print('Issue #${issue.number}: ${issue.title}');
}

拉取请求

创建拉取请求:

// 创建拉取请求
final pr = await gitHubKit.pullRequests.createPullRequest('octocat', 'Hello-World', 'New feature', 'feature-branch', 'main');
print('Created PR #${pr.number}');

获取拉取请求:

// 获取拉取请求
final fetchedPR = await gitHubKit.pullRequests.getPullRequest('octocat', 'Hello-World', 1);
print('PR title: ${fetchedPR.title}');

列出拉取请求:

// 列出拉取请求
final prs = await gitHubKit.pullRequests.listPullRequests('octocat', 'Hello-World', state: 'open');
for (var pr in prs) {
  print('PR #${pr.number}: ${pr.title}');
}

GitHub Actions

列出工作流:

// 列出工作流
final workflows = await gitHubKit.actions.listWorkflows('octocat', 'Hello-World');
for (var workflow in workflows) {
  print('Workflow: ${workflow.name}');
}

创建工作流调度事件:

// 创建工作流调度事件
await gitHubKit.actions.createWorkflowDispatch('octocat', 'Hello-World', 'main.yml', 'main');
print('Workflow dispatch created');

代码扫描

列出代码扫描警报:

// 列出代码扫描警报
final alerts = await gitHubKit.codeScanning.listCodeScanningAlerts('octocat', 'Hello-World');
for (var alert in alerts) {
  print('Alert #${alert.number}: ${alert.state}');
}

秘密扫描

列出秘密扫描警报:

// 列出秘密扫描警报
final secretAlerts = await gitHubKit.secretScanning.listSecretScanningAlerts('octocat', 'Hello-World');
for (var alert in secretAlerts) {
  print('Secret Alert #${alert.number}: ${alert.state}');
}

GraphQL API

使用 GraphQL 查询:

// 使用 GraphQL 查询
final result = await gitHubKit.graphql('''
  query {
    viewer {
      login
      repositories(first: 10) {
        nodes {
          name
          stargazerCount
        }
      }
    }
  }
''');
print('Logged in as: ${result['viewer']['login']}');

错误处理

GitHubKit 使用自定义异常进行错误处理。始终用 try-catch 块包裹 API 调用:

try {
  final repo = await gitHubKit.repositories.getRepository('octocat', 'Hello-World');
  print('Repository: ${repo.fullName}');
} catch (e) {
  if (e is GitHubException) {
    print('GitHub API Error: ${e.message} (Status: ${e.statusCode})');
  } else {
    print('Error: $e');
  }
}

分页

大多数列表方法在 GitHubKit 中自动处理分页。可以使用 perPagepage 参数控制分页:

// 控制分页
final repos = await gitHubKit.repositories.listRepositories('octocat', perPage: 100, page: 2);

速率限制

GitHubKit 通过在达到限制时重试请求来自动处理速率限制。可以在创建 GitHubKit 实例时配置重试行为:

// 配置重试行为
final gitHubKit = GitHubKit(
  token: 'your_token',
  maxRetries: 5,
  retryDelay: Duration(seconds: 10),
);

日志记录

GitHubKit 包含内置的日志系统。可以在创建 GitHubKit 实例时配置日志级别:

// 配置日志级别
final gitHubKit = GitHubKit(token: 'your_token');
gitHubKit.setLogLevel(LogLevel.debug);

测试

要运行 GitHubKit 的测试:

$ dart test

更多关于Flutter GitHub集成插件github_kit的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter GitHub集成插件github_kit的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用github_kit插件的示例代码。github_kit是一个用于与GitHub API进行交互的Flutter插件,它提供了一系列功能来访问GitHub数据。

首先,确保你已经在pubspec.yaml文件中添加了github_kit依赖:

dependencies:
  flutter:
    sdk: flutter
  github_kit: ^最新版本号  # 请替换为实际最新版本号

然后运行flutter pub get来获取依赖。

接下来,是一个基本的示例代码,展示了如何使用github_kit插件来获取用户的仓库列表:

import 'package:flutter/material.dart';
import 'package:github_kit/github_kit.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'GitHub Kit Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<Repository> repositories = [];
  bool isLoading = false;
  String errorMessage;

  @override
  void initState() {
    super.initState();
    fetchRepositories();
  }

  void fetchRepositories() async {
    setState(() {
      isLoading = true;
      errorMessage = null;
      repositories = [];
    });

    try {
      // 请替换为您的GitHub个人访问令牌
      final github = GitHub(accessToken: 'YOUR_GITHUB_ACCESS_TOKEN');

      // 获取当前用户的仓库列表
      final response = await github.repositories.listForUser('your-username');

      setState(() {
        repositories = response.items;
        isLoading = false;
      });
    } catch (e) {
      setState(() {
        errorMessage = e.toString();
        isLoading = false;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('GitHub Repositories'),
      ),
      body: isLoading
          ? Center(child: CircularProgressIndicator())
          : Column(
              children: <Widget>[
                if (errorMessage != null)
                  Text(
                    'Error: $errorMessage',
                    style: TextStyle(color: Colors.red),
                  ),
                Expanded(
                  child: ListView.builder(
                    itemCount: repositories.length,
                    itemBuilder: (context, index) {
                      final repo = repositories[index];
                      return ListTile(
                        title: Text(repo.name),
                        subtitle: Text(repo.description ?? 'No description'),
                      );
                    },
                  ),
                ),
              ],
            ),
    );
  }
}

class Repository {
  String name;
  String description;

  Repository({required this.name, this.description});

  // 根据github_kit插件返回的数据结构,你可能需要添加更多的字段和方法来解析数据
  factory Repository.fromJson(Map<String, dynamic> json) {
    return Repository(
      name: json['name'] as String,
      description: json['description'] as String?,
    );
  }
}

在这个示例中,我们做了以下几步:

  1. pubspec.yaml文件中添加github_kit依赖。
  2. 创建一个Flutter应用,并在主页(MyHomePage)中初始化并调用fetchRepositories方法来获取GitHub用户的仓库列表。
  3. fetchRepositories方法中,使用GitHub类(来自github_kit插件)并传入个人访问令牌(请确保替换为您自己的令牌)。
  4. 调用listForUser方法来获取指定用户的仓库列表,并将结果存储到状态中。
  5. 在UI中显示加载指示器、错误信息或仓库列表。

请注意,为了使用GitHub API,你需要一个有效的个人访问令牌,并且该令牌需要有访问用户仓库的权限。在实际应用中,请确保安全地存储和处理令牌,避免在客户端代码中硬编码。

回到顶部