From ce00adf54c2e7a2463619080edcefd83c7356144 Mon Sep 17 00:00:00 2001 From: Rongjian Zhang Date: Sun, 29 Sep 2019 15:35:33 +0800 Subject: [PATCH] feat: select branch with picker --- lib/models/theme.dart | 42 ++++++++++++++++++++++++++++++------- lib/screens/code_theme.dart | 1 - lib/screens/repository.dart | 34 ++++++++++++++++-------------- lib/widgets/picker.dart | 20 ------------------ 4 files changed, 53 insertions(+), 44 deletions(-) delete mode 100644 lib/widgets/picker.dart diff --git a/lib/models/theme.dart b/lib/models/theme.dart index ba58d9f..b7caf3a 100644 --- a/lib/models/theme.dart +++ b/lib/models/theme.dart @@ -2,7 +2,6 @@ import 'dart:io'; import 'dart:async'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:git_touch/widgets/picker.dart'; import 'package:shared_preferences/shared_preferences.dart'; class DialogOption { @@ -17,6 +16,26 @@ class AppThemeType { static const values = [AppThemeType.material, AppThemeType.cupertino]; } +class PickerItem { + final T value; + final String text; + PickerItem(this.value, {@required this.text}); +} + +class PickerGroupItem { + final T value; + final List> items; + final Function(T value) onChange; + final Function(T value) onClose; + + PickerGroupItem({ + @required this.value, + @required this.items, + this.onChange, + this.onClose, + }); +} + class ThemeModel with ChangeNotifier { static const storageKey = 'theme'; @@ -195,6 +214,8 @@ class ThemeModel with ChangeNotifier { static Timer _debounce; + String _selectedItem; + showPicker(BuildContext context, PickerGroupItem groupItem) async { switch (theme) { case AppThemeType.cupertino: @@ -213,18 +234,25 @@ class ThemeModel with ChangeNotifier { .toList() .indexWhere((v) => v.value == groupItem.value)), onSelectedItemChanged: (index) { - if (_debounce?.isActive ?? false) { - _debounce.cancel(); - } + _selectedItem = groupItem.items[index].value; - _debounce = Timer(const Duration(milliseconds: 500), () { - groupItem.onChange(groupItem.items[index].value); - }); + if (groupItem.onChange != null) { + if (_debounce?.isActive ?? false) { + _debounce.cancel(); + } + + _debounce = Timer(const Duration(milliseconds: 500), () { + groupItem.onChange(_selectedItem); + }); + } }, ), ); }, ); + if (groupItem.onClose != null) { + groupItem.onClose(_selectedItem); + } } } } diff --git a/lib/screens/code_theme.dart b/lib/screens/code_theme.dart index 8b27276..039a0f0 100644 --- a/lib/screens/code_theme.dart +++ b/lib/screens/code_theme.dart @@ -6,7 +6,6 @@ import 'package:git_touch/models/code.dart'; import 'package:git_touch/models/theme.dart'; import 'package:git_touch/scaffolds/single.dart'; import 'package:git_touch/widgets/app_bar_title.dart'; -import 'package:git_touch/widgets/picker.dart'; import 'package:git_touch/widgets/table_view.dart'; import 'package:provider/provider.dart'; diff --git a/lib/screens/repository.dart b/lib/screens/repository.dart index 8d0e2e4..50c1aca 100644 --- a/lib/screens/repository.dart +++ b/lib/screens/repository.dart @@ -101,7 +101,7 @@ class RepositoryScreen extends StatelessWidget { } } } - refs(first: 10, refPrefix: "refs/heads/") { + refs(first: 100, refPrefix: "refs/heads/") { totalCount nodes { name @@ -338,22 +338,24 @@ class RepositoryScreen extends StatelessWidget { var refs = payload['refs']['nodes'] as List; if (refs.length < 2) return; - // FIXME: Show all branches - var result = await Provider.of(context) - .showDialogOptions( + await Provider.of(context).showPicker( + context, + PickerGroupItem( + value: payload[branchInfoKey]['name'], + items: refs + .map((b) => PickerItem(b['name'] as String, + text: (b['name'] as String))) + .toList(), + onClose: (result) { + Provider.of(context) + .pushReplacementRoute( context, - refs - .map((b) => DialogOption( - value: b['name'] as String, - widget: Text(b['name'] as String))) - .toList()); - - if (result != null) { - Provider.of(context).pushReplacementRoute( - context, - (_) => RepositoryScreen(owner, name, - branch: result)); - } + (_) => RepositoryScreen(owner, name, + branch: result), + ); + }, + ), + ); }, ), ], diff --git a/lib/widgets/picker.dart b/lib/widgets/picker.dart deleted file mode 100644 index bb90039..0000000 --- a/lib/widgets/picker.dart +++ /dev/null @@ -1,20 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -class PickerItem { - final T value; - final String text; - PickerItem(this.value, {@required this.text}); -} - -class PickerGroupItem { - final T value; - final List> items; - final Function(T value) onChange; - - PickerGroupItem({ - @required this.value, - @required this.items, - @required this.onChange, - }); -}