From a67b389f72df832131dc23c931c22e5467889003 Mon Sep 17 00:00:00 2001 From: Rongjian Zhang Date: Mon, 2 Sep 2019 21:52:32 +0800 Subject: [PATCH] refactor: extract theme model from settings --- lib/main.dart | 15 ++- lib/models/theme.dart | 184 +++++++++++++++++++++++++++ lib/providers/settings.dart | 100 ++++----------- lib/scaffolds/list.dart | 5 +- lib/scaffolds/long_list.dart | 5 +- lib/scaffolds/refresh.dart | 5 +- lib/scaffolds/refresh_stateless.dart | 5 +- lib/scaffolds/simple.dart | 5 +- lib/screens/login.dart | 7 +- lib/screens/notifications.dart | 6 +- lib/screens/repo.dart | 4 +- lib/screens/search.dart | 22 ++-- lib/screens/settings.dart | 17 +-- lib/utils/utils.dart | 119 ----------------- lib/widgets/action.dart | 5 +- lib/widgets/comment_item.dart | 28 ++-- lib/widgets/link.dart | 14 +- lib/widgets/loading.dart | 5 +- 18 files changed, 293 insertions(+), 258 deletions(-) create mode 100644 lib/models/theme.dart diff --git a/lib/main.dart b/lib/main.dart index 083f5ea..2d25eb3 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; +import 'package:git_touch/models/theme.dart'; import 'package:git_touch/screens/repo.dart'; import 'package:primer/primer.dart'; import 'package:provider/provider.dart'; @@ -25,6 +26,15 @@ class _HomeState extends State { int active = 0; // String login; + @override + void initState() { + super.initState(); + nextTick(() { + // FIXME: + Provider.of(context).init(); + }); + } + Widget _buildNotificationIcon(BuildContext context) { int count = Provider.of(context).count; if (count == 0) { @@ -106,7 +116,7 @@ class _HomeState extends State { ); // TODO: - if (!settings.ready) { + if (!settings.ready || !Provider.of(context).ready) { return MaterialApp(theme: themData, home: Scaffold(body: Text('a'))); } @@ -115,7 +125,7 @@ class _HomeState extends State { return MaterialApp(theme: themData, home: LoginScreen()); } - switch (settings.theme) { + switch (Provider.of(context).theme) { case ThemeMap.cupertino: return CupertinoApp( home: CupertinoTheme( @@ -163,6 +173,7 @@ class App extends StatelessWidget { return MultiProvider( providers: [ ChangeNotifierProvider(builder: (context) => NotificationModel()), + ChangeNotifierProvider(builder: (context) => ThemeModel()), ], child: SettingsProvider(child: Home()), ); diff --git a/lib/models/theme.dart b/lib/models/theme.dart new file mode 100644 index 0000000..8338750 --- /dev/null +++ b/lib/models/theme.dart @@ -0,0 +1,184 @@ +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class DialogOption { + final T value; + final Widget widget; + DialogOption({this.value, this.widget}); +} + +class ThemeMap { + static const material = 0; + static const cupertino = 1; + static const values = [ThemeMap.material, ThemeMap.cupertino]; +} + +class ThemeModel with ChangeNotifier { + static const storageKey = 'theme'; + + int _theme; + int get theme => _theme; + bool get ready => _theme != null; + + init() async { + var prefs = await SharedPreferences.getInstance(); + + int v = prefs.getInt(storageKey); + print('read theme: $v'); + if (ThemeMap.values.contains(v)) { + _theme = v; + } else if (Platform.isIOS) { + _theme = ThemeMap.cupertino; + } else { + _theme = ThemeMap.material; + } + + notifyListeners(); + } + + Future setTheme(int v) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + + _theme = v; + await prefs.setInt(storageKey, v); + print('write theme: $v'); + + notifyListeners(); + } + + void pushRoute({ + @required BuildContext context, + @required WidgetBuilder builder, + bool fullscreenDialog = false, + }) { + switch (theme) { + case ThemeMap.cupertino: + Navigator.of(context).push(CupertinoPageRoute( + builder: builder, + fullscreenDialog: fullscreenDialog, + )); + break; + default: + Navigator.of(context).push(MaterialPageRoute( + builder: builder, + fullscreenDialog: fullscreenDialog, + )); + } + } + + Future showConfirm(BuildContext context, String text) { + switch (theme) { + case ThemeMap.cupertino: + return showCupertinoDialog( + context: context, + builder: (context) { + return CupertinoAlertDialog( + title: Text(text), + actions: [ + CupertinoDialogAction( + child: const Text('cancel'), + isDefaultAction: true, + onPressed: () { + Navigator.pop(context, false); + }, + ), + CupertinoDialogAction( + child: const Text('OK'), + onPressed: () { + Navigator.pop(context, true); + }, + ), + ], + ); + }, + ); + default: + return showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + content: Text( + text, + // style: dialogTextStyle + ), + actions: [ + FlatButton( + child: const Text('CANCEL'), + onPressed: () { + Navigator.pop(context, false); + }, + ), + FlatButton( + child: const Text('OK'), + onPressed: () { + Navigator.pop(context, true); + }, + ) + ], + ); + }, + ); + } + } + + Future showDialogOptions( + BuildContext context, List> options) { + var title = Text('Pick your reaction'); + var cancelWidget = Text('Cancel'); + + switch (theme) { + case ThemeMap.cupertino: + return showCupertinoDialog( + context: context, + builder: (BuildContext context) { + return CupertinoAlertDialog( + title: title, + actions: options.map((option) { + return CupertinoDialogAction( + child: option.widget, + onPressed: () { + Navigator.pop(context, option.value); + }, + ); + }).toList() + ..add( + CupertinoDialogAction( + child: cancelWidget, + isDestructiveAction: true, + onPressed: () { + Navigator.pop(context, null); + }, + ), + ), + ); + }, + ); + default: + return showDialog( + context: context, + builder: (BuildContext context) { + return SimpleDialog( + title: title, + children: options.map((option) { + return SimpleDialogOption( + child: option.widget, + onPressed: () { + Navigator.pop(context, option.value); + }, + ); + }).toList() + ..add(SimpleDialogOption( + child: cancelWidget, + onPressed: () { + Navigator.pop(context, null); + }, + )), + ); + }, + ); + } + } +} diff --git a/lib/providers/settings.dart b/lib/providers/settings.dart index b9bb30f..ff69884 100644 --- a/lib/providers/settings.dart +++ b/lib/providers/settings.dart @@ -37,12 +37,6 @@ class PlatformType { // Future queryGitlab(SettingsProviderState settings); // } -class ThemeMap { - static const material = 0; - static const cupertino = 1; - static const values = [0, 1]; -} - class SettingsProvider extends StatefulWidget { final Widget child; @@ -60,7 +54,6 @@ class SettingsProvider extends StatefulWidget { class SettingsProviderState extends State { bool ready = false; - int theme; Map githubAccountMap; Map>> accountMap; @@ -76,16 +69,6 @@ class SettingsProviderState extends State { String prefix = 'https://api.github.com'; - Future setTheme(int _theme) async { - SharedPreferences prefs = await SharedPreferences.getInstance(); - - theme = _theme; - await prefs.setInt(StorageKeys.theme, theme); - print('write theme: $theme'); - - setState(() {}); - } - String get token { if (activeLogin == null) return null; @@ -134,7 +117,7 @@ class SettingsProviderState extends State { 'client_id': clientId, 'client_secret': clientSecret, 'code': code, - 'state': randomString, + 'state': _oauthState, }), ); // print(res.body); @@ -215,7 +198,7 @@ class SettingsProviderState extends State { } void _initDataFromPref() async { - SharedPreferences prefs = await SharedPreferences.getInstance(); + var prefs = await SharedPreferences.getInstance(); // read GitHub accounts try { @@ -262,14 +245,6 @@ class SettingsProviderState extends State { accountMap = {}; } - int _theme = prefs.getInt(StorageKeys.theme); - print('read theme: $_theme'); - if (ThemeMap.values.contains(_theme)) { - theme = _theme; - } else if (Platform.isIOS) { - theme = ThemeMap.cupertino; - } - setState(() { ready = true; }); @@ -283,6 +258,9 @@ class SettingsProviderState extends State { }); } + Map get _headers => + {HttpHeaders.authorizationHeader: 'token $token'}; + // http timeout var _timeoutDuration = Duration(seconds: 10); // var _timeoutDuration = Duration(seconds: 1); @@ -315,7 +293,7 @@ class SettingsProviderState extends State { } Future getWithCredentials(String url, {String contentType}) async { - var headers = {HttpHeaders.authorizationHeader: 'token $token'}; + var headers = _headers; if (contentType != null) { // https://developer.github.com/v3/repos/contents/#custom-media-types headers[HttpHeaders.contentTypeHeader] = contentType; @@ -328,69 +306,37 @@ class SettingsProviderState extends State { return data; } - Future patchWithCredentials(String url) async { - var headers = {HttpHeaders.authorizationHeader: 'token $token'}; - await http.patch(prefix + url, headers: headers).timeout(_timeoutDuration); - - return true; + Future patchWithCredentials(String url) async { + await http.patch(prefix + url, headers: _headers).timeout(_timeoutDuration); } - Future putWithCredentials(String url, + Future putWithCredentials(String url, {String contentType, String body}) async { - var headers = {HttpHeaders.authorizationHeader: 'token $token'}; - final res = await http - .put(prefix + url, headers: headers, body: body ?? {}) + await http + .put(prefix + url, headers: _headers, body: body ?? {}) .timeout(_timeoutDuration); - - // print(res.body); - return true; } - Future postWithCredentials(String url, + Future postWithCredentials(String url, {String contentType, String body}) async { - var headers = {HttpHeaders.authorizationHeader: 'token $token'}; final res = await http - .post(prefix + url, headers: headers, body: body ?? {}) - .timeout(_timeoutDuration); - - // print(res.body); - return true; - } - - Future deleteWithCredentials(String url) async { - var headers = {HttpHeaders.authorizationHeader: 'token $token'}; - final res = await http - .delete(prefix + url, headers: headers) + .post(prefix + url, headers: _headers, body: body ?? {}) .timeout(_timeoutDuration); // print(res.body); - return true; } - void pushRoute({ - @required BuildContext context, - @required WidgetBuilder builder, - bool fullscreenDialog = false, - }) { - switch (theme) { - case ThemeMap.cupertino: - Navigator.of(context).push(CupertinoPageRoute( - builder: builder, - fullscreenDialog: fullscreenDialog, - )); - break; - default: - Navigator.of(context).push(MaterialPageRoute( - builder: builder, - fullscreenDialog: fullscreenDialog, - )); - } + Future deleteWithCredentials(String url) async { + await http + .delete(prefix + url, headers: _headers) + .timeout(_timeoutDuration); } - String randomString; - - generateRandomString() { - randomString = nanoid(); - return randomString; + String _oauthState; + void redirectToGithubOauth() { + _oauthState = nanoid(); + launch( + 'https://github.com/login/oauth/authorize?client_id=$clientId&redirect_uri=gittouch://login&scope=user%20repo&state=$_oauthState', + ); } @override diff --git a/lib/scaffolds/list.dart b/lib/scaffolds/list.dart index f2abea7..16a6ef0 100644 --- a/lib/scaffolds/list.dart +++ b/lib/scaffolds/list.dart @@ -1,7 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/widgets.dart'; -import '../providers/settings.dart'; +import 'package:git_touch/models/theme.dart'; +import 'package:provider/provider.dart'; import '../widgets/error_reload.dart'; import '../widgets/loading.dart'; import '../widgets/empty.dart'; @@ -185,7 +186,7 @@ class _ListScaffoldState extends State> { @override Widget build(BuildContext context) { - switch (SettingsProvider.of(context).theme) { + switch (Provider.of(context).theme) { case ThemeMap.cupertino: List slivers = [ CupertinoSliverRefreshControl(onRefresh: _refresh) diff --git a/lib/scaffolds/long_list.dart b/lib/scaffolds/long_list.dart index cefcf19..79ca5f6 100644 --- a/lib/scaffolds/long_list.dart +++ b/lib/scaffolds/long_list.dart @@ -1,7 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/widgets.dart'; -import '../providers/settings.dart'; +import 'package:git_touch/models/theme.dart'; +import 'package:provider/provider.dart'; import '../widgets/loading.dart'; import '../widgets/link.dart'; import '../widgets/error_reload.dart'; @@ -182,7 +183,7 @@ class _LongListScaffoldState extends State> { @override Widget build(BuildContext context) { - switch (SettingsProvider.of(context).theme) { + switch (Provider.of(context).theme) { case ThemeMap.cupertino: List slivers = [ CupertinoSliverRefreshControl(onRefresh: _refresh) diff --git a/lib/scaffolds/refresh.dart b/lib/scaffolds/refresh.dart index c4ecdd4..bee4f5a 100644 --- a/lib/scaffolds/refresh.dart +++ b/lib/scaffolds/refresh.dart @@ -1,7 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/widgets.dart'; -import '../providers/settings.dart'; +import 'package:git_touch/models/theme.dart'; +import 'package:provider/provider.dart'; import '../widgets/loading.dart'; import '../widgets/error_reload.dart'; @@ -81,7 +82,7 @@ class _RefreshScaffoldState extends State> { @override Widget build(BuildContext context) { - switch (SettingsProvider.of(context).theme) { + switch (Provider.of(context).theme) { case ThemeMap.cupertino: return CupertinoPageScaffold( navigationBar: CupertinoNavigationBar( diff --git a/lib/scaffolds/refresh_stateless.dart b/lib/scaffolds/refresh_stateless.dart index 0e123a9..7840116 100644 --- a/lib/scaffolds/refresh_stateless.dart +++ b/lib/scaffolds/refresh_stateless.dart @@ -1,7 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/widgets.dart'; -import '../providers/settings.dart'; +import 'package:git_touch/models/theme.dart'; +import 'package:provider/provider.dart'; import '../widgets/loading.dart'; import '../widgets/error_reload.dart'; @@ -39,7 +40,7 @@ class RefreshStatelessScaffold extends StatelessWidget { @override Widget build(BuildContext context) { - switch (SettingsProvider.of(context).theme) { + switch (Provider.of(context).theme) { case ThemeMap.cupertino: return CupertinoPageScaffold( navigationBar: diff --git a/lib/scaffolds/simple.dart b/lib/scaffolds/simple.dart index 88a70b9..3f1ef5d 100644 --- a/lib/scaffolds/simple.dart +++ b/lib/scaffolds/simple.dart @@ -1,7 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/widgets.dart'; -import '../providers/settings.dart'; +import 'package:git_touch/models/theme.dart'; +import 'package:provider/provider.dart'; class SimpleScaffold extends StatelessWidget { final Widget title; @@ -20,7 +21,7 @@ class SimpleScaffold extends StatelessWidget { @override Widget build(BuildContext context) { - switch (SettingsProvider.of(context).theme) { + switch (Provider.of(context).theme) { case ThemeMap.cupertino: return CupertinoPageScaffold( navigationBar: diff --git a/lib/screens/login.dart b/lib/screens/login.dart index ee61701..84948e7 100644 --- a/lib/screens/login.dart +++ b/lib/screens/login.dart @@ -113,12 +113,7 @@ class _LoginScreenState extends State { ...accounts.map(_buildAccountItem), _buildAddItem( text: 'GitHub Account', - onTap: () { - var state = settings.generateRandomString(); - launch( - 'https://github.com/login/oauth/authorize?client_id=$clientId&redirect_uri=gittouch://login&scope=user%20repo&state=$state', - ); - }, + onTap: settings.redirectToGithubOauth, ), // _buildAddItem( // text: 'GitLab Account', diff --git a/lib/screens/notifications.dart b/lib/screens/notifications.dart index 13eabd5..fedc334 100644 --- a/lib/screens/notifications.dart +++ b/lib/screens/notifications.dart @@ -3,6 +3,7 @@ import 'package:flutter/cupertino.dart'; import 'package:provider/provider.dart'; import '../scaffolds/refresh_stateless.dart'; import 'package:git_touch/models/notification.dart'; +import 'package:git_touch/models/theme.dart'; import '../providers/settings.dart'; import '../widgets/notification_item.dart'; import '../widgets/list_group.dart'; @@ -205,7 +206,7 @@ $key: pullRequest(number: ${item.number}) { }; Widget _buildTitle() { - switch (SettingsProvider.of(context).theme) { + switch (Provider.of(context).theme) { case ThemeMap.cupertino: // var textStyle = DefaultTextStyle.of(context).style; return DefaultTextStyle( @@ -224,7 +225,8 @@ $key: pullRequest(number: ${item.number}) { } void _confirm() async { - var value = await showConfirm(context, 'Mark all as read?'); + var value = await Provider.of(context) + .showConfirm(context, 'Mark all as read?'); if (value) { await SettingsProvider.of(context).putWithCredentials('/notifications'); await _onSwitchTab(); diff --git a/lib/screens/repo.dart b/lib/screens/repo.dart index 2a7f610..e73aa0b 100644 --- a/lib/screens/repo.dart +++ b/lib/screens/repo.dart @@ -2,8 +2,10 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; +import 'package:git_touch/models/theme.dart'; import 'package:git_touch/screens/commits.dart'; import 'package:git_touch/screens/object.dart'; +import 'package:provider/provider.dart'; import 'package:share/share.dart'; import 'package:url_launcher/url_launcher.dart'; import '../providers/settings.dart'; @@ -122,7 +124,7 @@ class _RepoScreenState extends State { break; } - SettingsProvider.of(context) + Provider.of(context) .pushRoute(context: context, builder: builder); }, ), diff --git a/lib/screens/search.dart b/lib/screens/search.dart index 27da887..a6580f9 100644 --- a/lib/screens/search.dart +++ b/lib/screens/search.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; +import 'package:git_touch/models/theme.dart'; +import 'package:provider/provider.dart'; import '../providers/settings.dart'; import '../scaffolds/simple.dart'; import '../utils/utils.dart'; @@ -42,7 +44,7 @@ class _SearchScreenState extends State { } Widget _buildInput() { - switch (SettingsProvider.of(context).theme) { + switch (Provider.of(context).theme) { case ThemeMap.cupertino: return CupertinoTextField( // padding: EdgeInsets.all(10), @@ -60,14 +62,16 @@ class _SearchScreenState extends State { return SimpleScaffold( title: Text('Search GitHub Repositories'), bodyBuilder: () { - return Column(children: [ - Container(padding: EdgeInsets.all(8), child: _buildInput()), - loading - ? Loading() - : Column( - children: repos.map((repo) => RepoItem(repo)).toList(), - ) - ]); + return Column( + children: [ + Container(padding: EdgeInsets.all(8), child: _buildInput()), + loading + ? Loading() + : Column( + children: repos.map((repo) => RepoItem(repo)).toList(), + ) + ], + ); }, ); } diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart index 24f1fdb..7d9e99e 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.dart @@ -1,8 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:git_touch/models/theme.dart'; +import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:launch_review/launch_review.dart'; import '../scaffolds/simple.dart'; -import '../providers/settings.dart'; import '../widgets/table_view.dart'; import '../screens/repo.dart'; import '../screens/login.dart'; @@ -15,7 +16,7 @@ class SettingsScreen extends StatefulWidget { class _SettingsScreenState extends State { @override Widget build(BuildContext context) { - var settings = SettingsProvider.of(context); + var themeProvider = Provider.of(context); return SimpleScaffold( title: Text('Settings'), @@ -36,19 +37,19 @@ class _SettingsScreenState extends State { items: [ TableViewItem( text: 'material', - checked: settings.theme == ThemeMap.material, + checked: themeProvider.theme == ThemeMap.material, onTap: () { - if (settings.theme != ThemeMap.material) { - settings.setTheme(ThemeMap.material); + if (themeProvider.theme != ThemeMap.material) { + themeProvider.setTheme(ThemeMap.material); } }, ), TableViewItem( text: 'cupertino', - checked: settings.theme == ThemeMap.cupertino, + checked: themeProvider.theme == ThemeMap.cupertino, onTap: () { - if (settings.theme != ThemeMap.cupertino) { - settings.setTheme(ThemeMap.cupertino); + if (themeProvider.theme != ThemeMap.cupertino) { + themeProvider.setTheme(ThemeMap.cupertino); } }, ), diff --git a/lib/utils/utils.dart b/lib/utils/utils.dart index 8844eda..46dc355 100644 --- a/lib/utils/utils.dart +++ b/lib/utils/utils.dart @@ -34,125 +34,6 @@ void nextTick(Function callback, [int milliseconds = 0]) { }); } -Future showConfirm(BuildContext context, String text) { - switch (SettingsProvider.of(context).theme) { - case ThemeMap.cupertino: - return showCupertinoDialog( - context: context, - builder: (context) { - return CupertinoAlertDialog( - title: Text(text), - actions: [ - CupertinoDialogAction( - child: const Text('cancel'), - isDefaultAction: true, - onPressed: () { - Navigator.pop(context, false); - }, - ), - CupertinoDialogAction( - child: const Text('OK'), - onPressed: () { - Navigator.pop(context, true); - }, - ), - ], - ); - }, - ); - default: - return showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - content: Text( - text, - // style: dialogTextStyle - ), - actions: [ - FlatButton( - child: const Text('CANCEL'), - onPressed: () { - Navigator.pop(context, false); - }, - ), - FlatButton( - child: const Text('OK'), - onPressed: () { - Navigator.pop(context, true); - }, - ) - ], - ); - }, - ); - } -} - -class DialogOption { - final T value; - final Widget widget; - DialogOption({this.value, this.widget}); -} - -Future showDialogOptions( - BuildContext context, List> options) { - var title = Text('Pick your reaction'); - var cancelWidget = Text('Cancel'); - - switch (SettingsProvider.of(context).theme) { - case ThemeMap.cupertino: - return showCupertinoDialog( - context: context, - builder: (BuildContext context) { - return CupertinoAlertDialog( - title: title, - actions: options.map((option) { - return CupertinoDialogAction( - child: option.widget, - onPressed: () { - Navigator.pop(context, option.value); - }, - ); - }).toList() - ..add( - CupertinoDialogAction( - child: cancelWidget, - isDestructiveAction: true, - onPressed: () { - Navigator.pop(context, null); - }, - ), - ), - ); - }, - ); - default: - return showDialog( - context: context, - builder: (BuildContext context) { - return SimpleDialog( - title: title, - children: options.map((option) { - return SimpleDialogOption( - child: option.widget, - onPressed: () { - Navigator.pop(context, option.value); - }, - ); - }).toList() - ..add(SimpleDialogOption( - child: cancelWidget, - onPressed: () { - Navigator.pop(context, null); - }, - )), - ); - }, - ); - } -} - TextSpan createLinkSpan(BuildContext context, String text, Function handle) { return TextSpan( text: text, diff --git a/lib/widgets/action.dart b/lib/widgets/action.dart index 122bd37..a28ade3 100644 --- a/lib/widgets/action.dart +++ b/lib/widgets/action.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; -import '../providers/settings.dart'; +import 'package:provider/provider.dart'; +import 'package:git_touch/models/theme.dart'; class MyAction { String text; @@ -28,7 +29,7 @@ class ActionButton extends StatelessWidget { @override Widget build(BuildContext context) { - switch (SettingsProvider.of(context).theme) { + switch (Provider.of(context).theme) { case ThemeMap.cupertino: return GestureDetector( child: Icon(iconData, size: 24), diff --git a/lib/widgets/comment_item.dart b/lib/widgets/comment_item.dart index e5bbf20..448f983 100644 --- a/lib/widgets/comment_item.dart +++ b/lib/widgets/comment_item.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; +import 'package:git_touch/models/theme.dart'; +import 'package:provider/provider.dart'; import 'package:timeago/timeago.dart' as timeago; import 'package:primer/primer.dart'; import '../utils/utils.dart'; @@ -102,19 +104,19 @@ class CommentItem extends StatelessWidget { ..add( Link( onTap: () async { - var result = await showDialogOptions( - context, - emojiMap.entries.map((entry) { - var emojiKey = entry.key; - return DialogOption( - value: emojiKey, - widget: Container( - decoration: _getDecorationByKey(emojiKey), - child: Text(emojiKey + ' ' + entry.value), - ), - ); - }).toList(), - ); + var result = await Provider.of(context) + .showDialogOptions( + context, + emojiMap.entries.map((entry) { + var emojiKey = entry.key; + return DialogOption( + value: emojiKey, + widget: Container( + decoration: _getDecorationByKey(emojiKey), + child: Text(emojiKey + ' ' + entry.value), + ), + ); + }).toList()); onReaction(result, _hasReacted(result)); }, child: Container( diff --git a/lib/widgets/link.dart b/lib/widgets/link.dart index 1462f3c..92a5f0c 100644 --- a/lib/widgets/link.dart +++ b/lib/widgets/link.dart @@ -1,7 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; +import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; -import '../providers/settings.dart'; +import 'package:git_touch/models/theme.dart'; class Link extends StatelessWidget { final Widget child; @@ -31,11 +32,10 @@ class Link extends StatelessWidget { } if (screenBuilder != null) { - SettingsProvider.of(context).pushRoute( - context: context, - builder: screenBuilder, - fullscreenDialog: fullscreenDialog, - ); + Provider.of(context).pushRoute( + context: context, + builder: screenBuilder, + fullscreenDialog: fullscreenDialog); } if (url != null) { @@ -45,7 +45,7 @@ class Link extends StatelessWidget { @override Widget build(BuildContext context) { - var theme = SettingsProvider.of(context).theme; + var theme = Provider.of(context).theme; if (iconButton != null) { return IconButton( diff --git a/lib/widgets/loading.dart b/lib/widgets/loading.dart index fda9e18..2b4365d 100644 --- a/lib/widgets/loading.dart +++ b/lib/widgets/loading.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; -import '../providers/settings.dart'; +import 'package:git_touch/models/theme.dart'; +import 'package:provider/provider.dart'; class Loading extends StatelessWidget { final bool more; @@ -10,7 +11,7 @@ class Loading extends StatelessWidget { Widget _buildIndicator(BuildContext context) { // return Image.asset('images/loading.webp'); - switch (SettingsProvider.of(context).theme) { + switch (Provider.of(context).theme) { case ThemeMap.cupertino: return CupertinoActivityIndicator(radius: 12); default: