From cc17a3e07570488c91ca9367b1a5a6f102b22cc1 Mon Sep 17 00:00:00 2001 From: Rongjian Zhang Date: Thu, 19 Sep 2019 19:52:18 +0800 Subject: [PATCH] refactor: picker params --- lib/models/theme.dart | 35 +++++++++++++++------- lib/screens/code_settings.dart | 54 ++++++++++++---------------------- 2 files changed, 42 insertions(+), 47 deletions(-) diff --git a/lib/models/theme.dart b/lib/models/theme.dart index fc869db..2882519 100644 --- a/lib/models/theme.dart +++ b/lib/models/theme.dart @@ -1,5 +1,5 @@ +import 'dart:async'; import 'dart:io'; - import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -10,6 +10,12 @@ class DialogOption { DialogOption({this.value, this.widget}); } +class PickerItem { + final T value; + final String text; + PickerItem(this.value, {@required this.text}); +} + class AppThemeMap { static const material = 0; static const cupertino = 1; @@ -182,11 +188,13 @@ class ThemeModel with ChangeNotifier { } } + static Timer _debounce; + Future showPicker( BuildContext context, { - @required int initialItem, - @required List children, - @required Function(int) onSelectedItemChanged, + @required T initialValue, + @required List> items, + @required Function(T item) onChange, }) { switch (theme) { case AppThemeMap.cupertino: @@ -196,13 +204,18 @@ class ThemeModel with ChangeNotifier { return Container( height: 300, child: CupertinoPicker( - backgroundColor: CupertinoColors.white, - children: children, - itemExtent: 40, - scrollController: - FixedExtentScrollController(initialItem: initialItem), - onSelectedItemChanged: onSelectedItemChanged, - ), + backgroundColor: CupertinoColors.white, + children: items.map((item) => Text(item.text)).toList(), + itemExtent: 40, + scrollController: FixedExtentScrollController( + initialItem: items + .indexWhere((item) => item.value == initialValue)), + onSelectedItemChanged: (index) { + if (_debounce?.isActive ?? false) _debounce.cancel(); + _debounce = Timer(const Duration(milliseconds: 500), () { + return onChange(items[index].value); + }); + }), ); }, ); diff --git a/lib/screens/code_settings.dart b/lib/screens/code_settings.dart index c49f700..d07f309 100644 --- a/lib/screens/code_settings.dart +++ b/lib/screens/code_settings.dart @@ -7,7 +7,6 @@ import 'package:flutter_highlight/theme_map.dart'; import 'package:git_touch/models/code.dart'; import 'package:git_touch/models/theme.dart'; import 'package:git_touch/scaffolds/simple.dart'; -import 'package:git_touch/utils/utils.dart'; import 'package:git_touch/widgets/app_bar_title.dart'; import 'package:git_touch/widgets/table_view.dart'; import 'package:provider/provider.dart'; @@ -38,17 +37,12 @@ class CodeSettingsScreen extends StatelessWidget { onTap: () { Provider.of(context).showPicker( context, - children: CodeModel.themes.map((k) => Text(k)).toList(), - initialItem: - CodeModel.themes.indexOf(codeProvider.theme), - onSelectedItemChanged: (int value) { - if (_themeDebounce?.isActive ?? false) - _themeDebounce.cancel(); - _themeDebounce = - Timer(const Duration(milliseconds: 500), () { - Provider.of(context) - .setTheme(CodeModel.themes[value]); - }); + items: CodeModel.themes + .map((t) => PickerItem(t, text: t)) + .toList(), + initialValue: codeProvider.theme, + onChange: (String value) { + Provider.of(context).setTheme(value); }, ); }), @@ -58,19 +52,13 @@ class CodeSettingsScreen extends StatelessWidget { onTap: () { Provider.of(context).showPicker( context, - children: CodeModel.fontSizes - .map((k) => Text(k.toString())) + items: CodeModel.fontSizes + .map( + (size) => PickerItem(size, text: size.toString())) .toList(), - initialItem: - CodeModel.fontSizes.indexOf(codeProvider.fontSize), - onSelectedItemChanged: (int value) { - if (_themeDebounce?.isActive ?? false) - _themeDebounce.cancel(); - _themeDebounce = - Timer(const Duration(milliseconds: 500), () { - Provider.of(context) - .setFontSize(CodeModel.fontSizes[value]); - }); + initialValue: codeProvider.fontSize, + onChange: (int value) { + Provider.of(context).setFontSize(value); }, ); }, @@ -81,18 +69,12 @@ class CodeSettingsScreen extends StatelessWidget { onTap: () { Provider.of(context).showPicker( context, - children: - CodeModel.fontFamilies.map((k) => Text(k)).toList(), - initialItem: CodeModel.fontFamilies - .indexOf(codeProvider.fontFamily), - onSelectedItemChanged: (int value) { - if (_themeDebounce?.isActive ?? false) - _themeDebounce.cancel(); - _themeDebounce = - Timer(const Duration(milliseconds: 500), () { - Provider.of(context) - .setFontFamily(CodeModel.fontFamilies[value]); - }); + items: CodeModel.fontFamilies + .map((v) => PickerItem(v, text: v)) + .toList(), + initialValue: codeProvider.fontFamily, + onChange: (String value) { + Provider.of(context).setFontFamily(value); }, ); },