flutter_jira_issue_collector

License: MIT Flutter pub.dev

Jira Issue Collector for Flutter -- fetch collector fields dynamically, show customizable forms, or submit issues programmatically in the background.

Features

  • Fetches issue collector form fields dynamically from Jira (Data Center / Server)
  • Shows a customizable form UI using builder pattern (bring your own widgets)
  • Submits issues programmatically in the background without any UI
  • Prefill and hide specific fields (e.g. email, reporter name)
  • Includes default Material field renderers as opt-in fallback
  • Full-screen dialog and bottom sheet presentation modes

Getting Started

Add the package to your pubspec.yaml:

dependencies:
  flutter_jira_issue_collector: ^0.1.0

Usage

Setup

import 'package:flutter_jira_issue_collector/flutter_jira_issue_collector.dart';

final collector = JiraIssueCollector(
  config: JiraCollectorConfig(
    baseUrl: 'https://jira.example.com',
    collectorId: '3e3ffaf3',
  ),
);

Background Mode (silent submission)

Submit issues programmatically without showing any UI:

final result = await collector.submitInBackground(
  fieldValues: {
    'summary': 'Crash on login screen',
    'description': 'App crashes when tapping the login button on Android 14.',
    'email': 'user@example.com',
  },
);

if (result.success) {
  print('Issue created: ${result.issueKey}');
}

UI Mode (dynamic form)

Open a full-screen dialog with fields fetched from the collector:

final result = await collector.showCollector(context);

UI Mode with Prefill + Hidden Fields

Prefill fields like email and hide them from the user:

final result = await collector.showCollector(
  context,
  prefillValues: {
    'email': 'user@example.com',
    'fullname': 'John Doe',
  },
  hiddenFieldIds: {'email', 'fullname'},
);

Bottom Sheet

final result = await collector.showCollectorBottomSheet(context);

Custom Field Rendering

Use builders to fully control the form UI:

final result = await collector.showCollector(
  context,
  fieldBuilder: (context, field, controller, onChanged, defaultWidget) {
    if (field.id == 'description') {
      return MyCustomDescriptionField(controller: controller);
    }
    return defaultWidget; // fallback to Material widget
  },
  layoutBuilder: (context, fieldWidgets, onSubmit, isSubmitting) {
    return MyCustomFormLayout(
      fields: fieldWidgets,
      onSubmit: onSubmit,
      isSubmitting: isSubmitting,
    );
  },
);

Inspect Available Fields

Fetch fields without showing UI -- useful for discovering field IDs:

final fields = await collector.fetchFields();
for (final field in fields) {
  print('${field.id}: ${field.label} (${field.type}, required: ${field.required})');
}

Jira Setup

  1. In Jira, go to Administration > Issue Collectors
  2. Create or edit a collector
  3. Copy the collector ID from the embed script URL:
    .../issueCollectorBootstrap.js?collectorId=3e3ffaf3
    
  4. Use your Jira base URL and collector ID in JiraCollectorConfig

Cleanup

collector.dispose();

License

MIT

Libraries

flutter_jira_issue_collector
A Flutter package to connect to Jira Issue Collector — fetch fields dynamically, show customizable forms, or submit issues programmatically in the background.