A GitLab client by Flutter.
Switch branches/tags
Nothing to show
Clone or download
Type Name Latest commit message Commit time
Failed to load latest commit information.
android doc: update readme Dec 7, 2018
art doc: update readme Dec 7, 2018
ios doc: update readme Nov 2, 2018
lib refactor(home_page,groups): remove chore code Dec 12, 2018
.gitignore feat: add merge request detail page Nov 1, 2018
.metadata feat: dispaly Projects Oct 28, 2018
LICENSE Create LICENSE Nov 2, 2018
README.md doc: update readme Dec 7, 2018
pubspec.yaml chore: add http dependence Dec 7, 2018




Flutter for GitLab. Support Android & IOS.

Run Project

Please referer to Set up an editor.

Yet another open-source GitLab client app but unlike any other app, F4Lab is building by Flutter.

Welcome to contribute to the following features.


  • App
    • Login by Personal Access Token
    • Projects
    • Themes mode
    • Markdown and code highlighting support
    • Search Users/Orgs, Repos, Issues/MRs & Code.
  • Repositories
    • Edit, Create & Delete files (commit)
    • Edit, Create & Delete files (Project Columns Cards)
    • Search Repos
    • Browse and search Repos
    • See your public, private and forked Repos
    • Filter Branches and Commits
  • Issues and Pull Requests
    • Search Issues/MRs
    • Filter Issues/MRs
    • Open/close Issues/MRs
    • Comment on Issues/MRs
    • Manage Issue/PR comments
    • Edit Issues/MRs
    • Assign people and add Labels and Milestones to Issues/MRs
    • Merge MRs
    • MRs request review changes/approve & comment.
    • MRs statuses
    • Approve MR
    • CI Status
    • Play|Cancel|Retry CI Job
  • Organisations
    • Feeds
    • Repos
  • PipeLines
    • List project's pipepine
    • Play, Retry, Cancel Pipeline Job

GitLab Api

Specs / Open-source libraries:


Please contribute to the project either by creating a PR or submitting an issue on GitHub.

Comm Widget

GitLab Client

Wrapped api request.

  • setup token and host
  • request headers
  • generate full url


GitlabClient _client = GitlabClient.newInstance();
final url = "";
final remoteData = await _client
        .then((resp) {
          page = int.tryParse(resp.headers['x-page'] ?? 0);
          total = int.tryParse(resp.headers['x-total-pages'] ?? 0);
          next = int.tryParse(resp.headers['x-next-page'] ?? 0);
          return resp;
        .then((resp) => utf8.decode(resp.bodyBytes))
        .then((s) => jsonDecode(s))
        .catchError((err) {
          print("loadData err: $err");
          return [];
    return remoteData;
/// remoteData: Object or List


It is a common component that contains some logics. as follows:

  • Automatically load data
  • Pull down to refresh
  • Pull up page load
///[canPullUp] This bool will affect whether or not to have the function of drop-up load
///[canPullDown] This bool will affect whether or not to have the function of drop-down refresh
///[withPage] Tihs bool will affect whether or not to add page arg to request url
abstract class CommListWidget extends StatefulWidget {
  final bool canPullUp;

  final bool canPullDown;

  final bool withPage;

      {this.canPullDown = true, this.canPullUp = true, this.withPage = true});


/// Create a list statefull widget

class ProjectTab extends CommListWidget {
  final String type;


  State<StatefulWidget> createState() => ProjectState(

/// Create a state for list

class ProjectState extends CommListState {
  ProjectState(String endPoint) : super(endPoint);

  Widget childBuild(BuildContext context, int index) {
    final item = data[index];
    return Card(...);


Copyright (C) 2018 StefanJi.
(See the LICENSE file for the whole license text.)


Light Dark
First Sec
Repo Merge Request
Third Fourth
Groups Jobs
Five Six