Flutter JIRA集成插件ispect_jira的使用

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

Flutter JIRA集成插件ispect_jira的使用

Logo 与 标题

一个用于移动应用调试的手动工具箱 🚀

ISpect 是一个灵感来自网页检查器的简单但多功能库,专门为移动应用开发设计。
此插件允许通过反馈立即使用 Jira Atlassian Api 创建问题工单。
点个赞并给项目加星以支持我们的项目!

徽章

Pub License: MIT Pub

Pub likes Pub popularity Pub points

其他包

#

ISpect 可以通过以下部分扩展

版本 描述
ispect Pub
ispect_ai Pub 一个附加包,使用Gemini AI Api生成报告日志问题。
ispect_jira Pub 一个附加包,使用Jira Atlassian Api通过反馈立即创建问题工单。
ispect_device Pub 一个额外的包,用于查看平台和设备信息。
ispectify Pub 一个额外的包,用于记录和处理。基于 Talker
ispectify_bloc Pub 一个额外的包,用于记录和处理 BLoC
ispectify_dio Pub 一个额外的包,用于记录和处理 Dio
ispectify_http Pub 一个额外的包,用于记录和处理 http

功能

📌 特性 #

  • ✅ 可拖拽面板,用于跳转到 ISpect 页面并管理检查工具。
    你也可以单独使用它:[draggable_panel](https://pub.dev/packages/draggable_panel)
  • ✅ 支持本地化:ru, en, kk。(未来我会添加更多翻译。)
  • ISpectify 日志实现:BLoC, Dio, http, 路由, Provider
  • ✅ 初始化 ISpect 时可以自定义更多选项,如 BLoC, 错误处理器等。
  • ✅ 更新了 ISpect 页面:增加了更多选项。
    • 详细的 HTTP 日志:请求, 响应, 错误
    • 调试工具
    • 缓存管理器
    • 设备和应用信息 (ispect_device)
  • ✅ 来自 pub.dev/feedback 的反馈构建器。
  • ✅ 性能跟踪器。
  • ✅ AI助手。

展示图

📜 展示 #

使用前准备

📌 在开始使用 Inspect Jira 前 #

为了进入 Jira 的授权页面,你需要打开 ISpect,点击“汉堡菜单”(动作),然后打开“Jira”。第一次会带你到授权页面,之后会带你到 Jira 工单创建页面。

  • 接下来你会看到授权页面。如指示所示,你需要登录 Jira,点击你的头像并进入“账户管理”
  • 转到“设置”
  • 滚动到底部的“API 令牌”,点击“创建和管理 API 令牌”
  • 然后点击“创建 API 令牌”,复制并粘贴令牌到应用程序中。

你应该得到类似的东西。 在“项目域”字段中输入域名,例如 “anydevkz”,然后是你用来登录 Jira 的邮箱。它可以在设置中找到。 当你点击“授权”时,系统会验证你的数据,如果一切符合要求,你将需要选择你的活跃项目。这可以随时更改。

然后返回并当你再次进入 Jira 页面时,你将被带到任务创建页面。

在这里你可以选择一个项目,如前所述,这是一个中间的强制步骤。你选择一个项目并继续。但如果你需要,你可以切换到另一个项目。

另外,在 Jira 授权后,你将在描述问题时有一个“创建 Jira 工单”按钮。 它会立即带你到带有问题描述和截图附件的问题创建页面。

开始使用

📌 开始使用 #

遵循这些步骤来使用这个包:

简易使用

ISpect 的简单示例用法
你可以使用 ISpect.read(context) 来管理 ISpect。 将这段代码放在你的项目中的一个屏幕,并了解它是如何工作的。😊

使用说明:
  1. runApp 包裹在 ISpect.run 方法中,并传递一个 ISpectify 实例。

  2. MaterialApp 中初始化 ISpectJiraClient 并传递必要的参数。 例如,从本地存储中获取。

ISpectJiraClient.initialize(
      projectDomain: 'domain',
      userEmail: 'example@example.com',
      apiToken: 'token',
      projectId: '10007',
      projectKey: 'GTMS4',
    );
  1. ISpectOptionsactionItems 中添加 Jira 动作按钮。
actionItems: [
          ISpectifyActionItem(
            title: 'ISpect',
            icon: Icons.bug_report_outlined,
            onTap: (context) {
              if (ISpectJiraClient.isInitialized) {
                Navigator.push(
                  context,
                  MaterialPageRoute<dynamic>(
                    builder: (_) => const JiraSendIssueScreen(),
                    settings: const RouteSettings(
                      name: 'Jira Send Issue Page',
                    ),
                  ),
                );
              } else {
                Navigator.push(
                  context,
                  MaterialPageRoute<dynamic>(
                    builder: (_) => JiraAuthScreen(
                      onAuthorized: (domain, email, apiToken, projectId, projectKey) {
                        /// 保存到本地存储,例如 `shared_preferences`
                      },
                    ),
                    settings: const RouteSettings(
                      name: 'Jira Auth Page',
                    ),
                  ),
                );
              }
            },
          ),
        ],
  1. MaterialApplocalizationsDelegates 中添加 ISpectJiraLocalization
localizationsDelegates: ISpectLocalizations.localizationDelegates([
          ExampleGeneratedLocalization.delegate,
          ISpectJiraLocalization.delegate,
        ]),
  1. ISpectScopeWrapper 包装你的根小部件以启用 ISpect,你可以传递主题和选项。

  2. 在你的 Material App 的 builder 中添加 ISpectBuilder 小部件,并传递 NavigatorObserverJiraFeedbackBuilder

child = ISpectBuilder(
            observer: observer,
            feedbackBuilder: (context, onSubmit, controller) => JiraFeedbackBuilder(
              onSubmit: onSubmit,
              theme: theme,
              scrollController: controller,
            ),
            initialPosition: (x: 0, y: 200),
            onPositionChanged: (x, y) {
              /// 保存到本地存储,例如 `shared_preferences`
            },
            child: child,
          );

请检查 示例 获取更多详细信息。

注意

  • 要添加 ISpect AI helper,请遵循此处提供的说明 [ispect_ai](https://github.com/yelmuratoff/ispect/tree/main/packages/ispect_ai)。

你还可以直接在 [ispect_ai/example](https://github.com/yelmuratoff/ispect/tree/main/packages/ispect_ai/example) 查看使用示例。

  • 要使用 平台 & 设备 工具,请遵循此处提供的说明 [ispect_device](https://github.com/yelmuratoff/ispect/tree/main/packages/ispect_device)。

你还可以直接在 [ispect_device/example](https://github.com/yelmuratoff/ispect/tree/main/packages/ispect_device/example) 查看使用示例。

参考包


感谢所有为这个包做出贡献的人


示例代码

import 'package:flutter/material.dart';
import 'package:ispect/ispect.dart';
import 'package:ispect_jira/ispect_jira.dart';
import 'package:ispect_jira_example/src/core/localization/generated/app_localizations.dart';
import 'package:ispect_jira_example/theme_manager.dart';

void main() {
  final iSpectify = ISpectifyFlutter.init();

  ISpect.run(
    () => runApp(
      ThemeProvider(
        child: App(iSpectify: iSpectify),
      ),
    ),
    iSpectify: iSpectify,
    isPrintLoggingEnabled: true,
  );
}

class App extends StatefulWidget {
  final ISpectify iSpectify;
  const App({super.key, required this.iSpectify});

  [@override](/user/override)
  State<App> createState() => _AppState();
}

class _AppState extends State<App> {
  [@override](/user/override)
  void initState() {
    super.initState();
    ISpectJiraClient.initialize(
      projectDomain: 'domain',
      userEmail: 'example@example.com',
      apiToken: 'token',
      projectId: '10007',
      projectKey: 'GTMS4',
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    const locale = Locale('en');
    final observer = ISpectNavigatorObserver();

    final themeMode = ThemeProvider.themeMode(context);

    return ISpectScopeWrapper(
      options: ISpectOptions(
        locale: locale,
        panelButtons: [
          (
            icon: Icons.copy_rounded,
            label: 'Token',
            onTap: (context) {
              debugPrint('Token copied');
            },
          ),
        ],
        panelItems: [
          (
            icon: Icons.home,
            enableBadge: false,
            onTap: (context) {
              debugPrint('Home');
            },
          ),
        ],
        actionItems: [
          ISpectifyActionItem(
            title: 'ISpect',
            icon: Icons.bug_report_outlined,
            onTap: (context) {
              if (ISpectJiraClient.isInitialized) {
                Navigator.push(
                  context,
                  MaterialPageRoute<dynamic>(
                    builder: (_) => const JiraSendIssueScreen(),
                    settings: const RouteSettings(
                      name: 'Jira Send Issue Page',
                    ),
                  ),
                );
              } else {
                Navigator.push(
                  context,
                  MaterialPageRoute<dynamic>(
                    builder: (_) => JiraAuthScreen(
                      onAuthorized: (domain, email, apiToken, projectId, projectKey) {
                        ISpect.good(
                          '''✅ Jira authorized:
  Project domain: $domain
  User email: $email
  Project id: $projectId
  API token: $apiToken
  Project key: $projectKey''',
                        );
                      },
                    ),
                    settings: const RouteSettings(
                      name: 'Jira Auth Page',
                    ),
                  ),
                );
              }
            },
          ),
        ],
      ),
      isISpectEnabled: true,
      child: MaterialApp(
        navigatorObservers: [observer],
        locale: locale,
        supportedLocales: ExampleGeneratedLocalization.supportedLocales,
        localizationsDelegates: ISpectLocalizations.localizationDelegates([
          ExampleGeneratedLocalization.delegate,
          ISpectJiraLocalization.delegate,
        ]),
        theme: ThemeData.from(
          colorScheme: ColorScheme.fromSeed(
            seedColor: Colors.blue,
            brightness: Brightness.light,
          ),
        ),
        darkTheme: ThemeData.from(
          colorScheme: ColorScheme.fromSeed(
            seedColor: Colors.blue,
            brightness: Brightness.dark,
          ),
        ),
        themeMode: themeMode,
        builder: (context, child) {
          child = ISpectBuilder(
            observer: observer,
            feedbackBuilder: (context, onSubmit, controller) => JiraFeedbackBuilder(
              onSubmit: onSubmit,
              theme: Theme.of(context),
              scrollController: controller,
            ),
            initialPosition: (x: 0, y: 200),
            onPositionChanged: (x, y) {
              debugPrint('x: $x, y: $y');
            },
            child: child,
          );
          return child;
        },
        home: const _Home(),
      ),
    );
  }
}

class _Home extends StatelessWidget {
  const _Home();

  [@override](/user/override)
  Widget build(BuildContext context) {
    final themeMode = ThemeProvider.themeMode(context);

    return Scaffold(
      appBar: AppBar(
        title: Text(ExampleGeneratedLocalization.of(context)!.app_title),
        actions: [
          IconButton(
            icon: Icon(
              themeMode == ThemeMode.dark ? Icons.dark_mode : Icons.light_mode,
            ),
            onPressed: () {
              ThemeProvider.toggleTheme(context);
            },
          ),
        ],
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () {
                ISpect.good('Good log');
                ISpect.info('Info log');
                ISpect.warning('Warning log');
              },
              child: const Text('Print some logs'),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中集成并使用ispect_jira插件的一个基本示例。这个插件可以帮助你与JIRA进行集成,以便执行一些常见的操作,比如获取项目、问题等。

首先,确保你已经在Flutter项目的根目录下。

第一步:添加依赖

pubspec.yaml文件中添加ispect_jira依赖:

dependencies:
  flutter:
    sdk: flutter
  ispect_jira: ^最新版本号  # 请检查pub.dev以获取最新版本号

然后运行以下命令来安装依赖:

flutter pub get

第二步:配置JIRA API

你需要获取JIRA API的访问令牌(API Token)和JIRA实例的URL。

第三步:使用ispect_jira插件

以下是一个基本的示例,展示了如何使用ispect_jira插件来获取JIRA项目列表。

main.dart

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  final JiraClient jiraClient = JiraClient(
    baseUrl: 'https://your-jira-instance.atlassian.net',  // 替换为你的JIRA实例URL
    apiToken: 'your-api-token',  // 替换为你的API Token
  );

  List<Project> projects = [];

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

  Future<void> fetchProjects() async {
    try {
      final result = await jiraClient.getProjects();
      setState(() {
        projects = result;
      });
    } catch (error) {
      print('Error fetching projects: $error');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter JIRA Integration'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: projects.isEmpty
            ? Center(child: Text('Loading projects...'))
            : ListView.builder(
                itemCount: projects.length,
                itemBuilder: (context, index) {
                  final project = projects[index];
                  return ListTile(
                    title: Text(project.name),
                    subtitle: Text(project.key),
                  );
                }),
      ),
    );
  }
}

JiraClient.dart (假设插件提供了这样的类,实际可能有所不同)

请注意,以下JiraClient类是一个假设的实现,因为ispect_jira插件的具体API可能会有所不同。你需要参考插件的官方文档或源代码来获取正确的类和方法。

class JiraClient {
  final String baseUrl;
  final String apiToken;

  JiraClient({required this.baseUrl, required this.apiToken});

  Future<List<Project>> getProjects() async {
    // 这是一个假设的实现,实际API调用可能有所不同
    final response = await http.get(Uri.parse('$baseUrl/rest/api/3/project'), headers: {
      'Authorization': 'Bearer $apiToken',
      'Content-Type': 'application/json',
    });

    if (response.statusCode == 200) {
      final data = await response.json();
      return data['values'].map((projectData) => Project.fromJson(projectData)).toList();
    } else {
      throw Exception('Failed to fetch projects');
    }
  }
}

class Project {
  String self;
  String id;
  String key;
  String name;
  String projectTypeKey;
  bool simplified;
  String avatarUrls;

  Project.fromJson(Map<String, dynamic> json) {
    self = json['self'];
    id = json['id'];
    key = json['key'];
    name = json['name'];
    projectTypeKey = json['projectTypeKey'];
    simplified = json['simplified'];
    avatarUrls = json['avatarUrls'];
  }
}

注意事项

  1. API版本:确保你使用的JIRA REST API版本与插件兼容。
  2. 权限:确保你的API Token具有足够的权限来执行所需的操作。
  3. 错误处理:在生产代码中,添加更多的错误处理和用户反馈。
  4. 依赖版本:总是检查pub.dev上的最新版本,并更新你的pubspec.yaml文件。

这个示例应该能帮助你开始在Flutter项目中集成ispect_jira插件。如果你遇到任何问题,请参考插件的官方文档或源代码以获取更多详细信息。

回到顶部