Flutter GitHub监控插件github_snitch的使用

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

Flutter GitHub监控插件github_snitch的使用

GitHub Snitch

GitHub Snitch 是一个 Flutter 包,它可以帮助你自动在 GitHub 上报告错误和问题。还可以用于提交现有问题的评论。 演示测试地址: https://gh-snitch.web.app

特性

  • 在 GitHub 问题上报告错误,并指定标签、指派人和里程碑
    • 当在 main 中调用 listenToExceptions 方法时自动执行(如示例所示)
    • 使用 report 方法手动执行
  • 支持离线情况(本地保存并在连接后发送)
  • 获取带有所有评论的已报告问题
  • 提交用户评论和仓库所有者的 GitHub 问题回复
  • 在报告中包含截图以更好地澄清问题。
  • 通过添加评论 (+1) 来处理重复报告的问题
  • 使用 onReport 方法处理 API 集成
  • 创建包的跟进标签
    • GhSnitch-external 用于未被 Flutter 框架捕获的错误
    • GhSnitch-internal 用于被 Flutter 框架捕获的错误
  • 由 GhSnitch 包报告,以便知道哪些问题是通过此包报告的

即将到来的功能

  • 支持与用户和仓库所有者聊天的通知

技巧

小贴士

建议使用空仓库来报告问题和错误,然后将重要项目转移到主仓库。

小贴士

为了从问题评论中向用户发送屏幕截图,可以使用一些网站上传图像并添加链接到评论,不要使用 GitHub 仓库中的截图,因为这将不起作用。

小贴士

你可以通过调用 GhSnitch.openReportScreen(context); 来使用现成的屏幕,或者构建自己的屏幕并使用方法如 GhSnitch.reportGhSnitch.submitComment 来提交问题和评论。

小贴士

创建一个用于上传截图的分支,命名为 screenshots 或任何你想要的名字,但你需要将这个名称传递给 GhSnitch.report 方法中的 screenShotBranch 参数。如果你使用了 GhSnitch.openReportScreen(context);,你应该使用 screenshots 名称。

开始使用

安装包后,你需要生成一个精细粒度个人访问令牌。选择精细粒度个人访问令牌并选择你的仓库,然后在仓库权限中检查问题。访问权限:读写。

我们还需要 owner usernamerepo name

我们将使用环境变量来保存这些敏感密钥。

使用

运行或构建应用时,只需为每个键传递 --dart-define 作为示例:

flutter build apk --split-per-abi --dart-define owner=owner --dart-define repo=repo --dart-define token=token

然后在 runApp 方法之前添加以下代码。正如你所看到的,我们使用了来自环境的键。

WidgetsFlutterBinding.ensureInitialized();
const String owner = String.fromEnvironment('owner');
String appFlavor = 'x';
String appVersion = '2.0.0';
GhSnitch.initialize(
    owner: owner,
    token: const String.fromEnvironment('token'),
    repo: const String.fromEnvironment("repo"));
if (kReleaseMode) {
  // 为自动报告异常和错误
  GhSnitch.listenToExceptions(assignees: [owner], labels: [appFlavor, appVersion]);
}
runApp(const MyApp());

现在 GitHub Snitch 已初始化,你可以开始报告错误和问题。为此,你可以调用 report 方法:

GhSnitch.report(
  title: '<issue-title>',
  body: '<issue-body>',
  screenShot: '<screenshot-url>',
  screenShotBranch: '<screenshot-branch>',
  labels: <List<String>?>,
  assignees: <List<String>?>,
  milestone: '<milestone>' if null will create new milestone with app version name,
  userId: '<user-id if exist if not package will use deviceID>',
);

report 方法接受以下参数:

  • title: 问题的标题。
  • body: 问题的正文。
  • screenShot: 截图的 URL。
  • screenShotBranch: 参数指定截图将保存在仓库的哪个分支。
  • labels: 问题的标签列表。
  • assignees: 分配问题的用户列表。
  • milestone: 关联问题的里程碑。

监听异常

GitHub Snitch 还可用于监听异常和错误。为此,可以调用 listenToExceptions 方法:

GhSnitch.listenToExceptions(
  assignees: <List<String>?>,
  milestone: <int?>,
);

listenToExceptions 方法接受以下参数:

  • assignees: 分配问题的用户列表。
  • milestone: 关联问题的里程碑。

当检测到异常或错误时,GitHub Snitch 将自动在 GitHub 上创建一个问题。

提交评论

GitHub Snitch 还可用于提交现有问题的评论。为此,可以调用 submitComment 方法:

GhSnitch.submitComment(
  reportId: '<issue-id>',
  comment: '<comment-text>',
);

submitComment 方法接受以下参数:

  • reportId: 问题的 ID。
  • comment: 评论文本。

结论

GitHub Snitch 是一个强大的工具,可以帮助你在 GitHub 上跟踪错误和问题。还可以用于提交现有问题的评论。如果你正在寻找一种改善 GitHub 工作流的方法,我强烈推荐查看 GitHub Snitch。

欢迎为这个包贡献,可以通过在 https://github.com/M97Chahboun/github_snitch 上打开问题或提交拉取请求。


完整示例代码

以下是完整的示例代码:

import 'dart:developer';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:github_snitch/github_snitch.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  const String owner = String.fromEnvironment('owner');
  GhSnitch.initialize(
      owner: owner,
      maxDuplicatedReports: 2,
      onReport: (title, body, labels, milestone, userId) {
        log(title);
      },
      token: const String.fromEnvironment('token'),
      repo: const String.fromEnvironment("repo"));

  if (!kReleaseMode) {
    // 为自动报告异常和错误
    GhSnitch.listenToExceptions(assignees: [owner], labels: ['flavorX']);
  }
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // 此小部件是您的应用程序的根。
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Report Issues on your repo',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Github Snitch'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    Navigator.of(context)
        .push(MaterialPageRoute(builder: (BuildContext context) {
      return const ScreenError(555);
    }));
    setState(() {
      _counter++;
    });
  }

  int h = 55;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
        actions: [
          IconButton(
              onPressed: () {
                GhSnitch.openReportScreen(context);
              },
              icon: const Icon(Icons.report))
        ],
      ),
      body: Row(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          const Text(
            'You have pushed the button this many times:',
          ),
          Text(
            '$_counter',
            style: Theme.of(context).textTheme.headlineMedium,
          ),
        ],
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

class ScreenError extends StatelessWidget {
  const ScreenError(this.wrong, {super.key});
  final dynamic wrong;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Center(
      child: Text("Hello" + wrong.toString()),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用github_snitch插件来监控GitHub仓库活动的代码案例。github_snitch插件允许你监听GitHub上的特定事件,比如issues、pull requests等的更新。

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

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

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

接下来,你可以按照以下步骤在Flutter应用中设置和使用github_snitch插件:

  1. 设置GitHub OAuth Token

    你需要在GitHub上生成一个OAuth Token,并授予它适当的权限(如repo权限)来访问仓库的数据。确保将生成的Token安全存储,不要在代码中硬编码。

  2. 初始化GithubSnitch客户端

    在你的Flutter应用中,初始化GithubSnitch客户端,并使用你的OAuth Token进行身份验证。

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late GithubSnitch _githubSnitch;

  @override
  void initState() {
    super.initState();
    // 使用你的GitHub OAuth Token初始化GithubSnitch
    String githubToken = 'YOUR_GITHUB_OAUTH_TOKEN'; // 请替换为你的实际Token
    _githubSnitch = GithubSnitch(token: githubToken);

    // 订阅仓库事件
    _subscribeToRepositoryEvents();
  }

  void _subscribeToRepositoryEvents() {
    // 替换为你的仓库所有者名称和仓库名称
    String owner = 'owner-name';
    String repo = 'repo-name';

    _githubSnitch.subscribeToRepository(
      owner: owner,
      repo: repo,
      onIssueEvent: (event) {
        print('Issue event: $event');
      },
      onPullRequestEvent: (event) {
        print('Pull request event: $event');
      },
      // 你可以根据需要添加更多事件监听器,如onCommitEvent, onPushEvent等
    );
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('GitHub Snitch Demo'),
        ),
        body: Center(
          child: Text('Listening for GitHub events...'),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个Flutter应用,并在initState方法中初始化了GithubSnitch客户端。然后,我们订阅了一个特定仓库的issues和pull requests事件,并在控制台中打印出接收到的事件。

注意

  • 请确保将YOUR_GITHUB_OAUTH_TOKEN替换为你实际的GitHub OAuth Token。
  • owner-namerepo-name替换为你想要监控的GitHub仓库的所有者名称和仓库名称。

这个示例仅展示了如何使用github_snitch插件监听GitHub事件。你可以根据实际需求扩展这个示例,比如将事件显示在UI上,或者根据事件类型执行不同的操作。

回到顶部