1
0
mirror of https://github.com/stonega/tsacdop synced 2025-02-10 00:20:49 +01:00

Update menu style.

This commit is contained in:
stonegate 2020-08-16 01:31:07 +08:00
parent 6f8b671acb
commit 631b03609a
5 changed files with 294 additions and 337 deletions

View File

@ -25,6 +25,7 @@ import '../util/audiopanel.dart';
import '../util/custom_widget.dart'; import '../util/custom_widget.dart';
import '../util/episodegrid.dart'; import '../util/episodegrid.dart';
import '../util/extension_helper.dart'; import '../util/extension_helper.dart';
import '../util/general_dialog.dart';
import 'podcast_settings.dart'; import 'podcast_settings.dart';
class PodcastDetail extends StatefulWidget { class PodcastDetail extends StatefulWidget {
@ -331,13 +332,10 @@ class _PodcastDetailState extends State<PodcastDetail> {
widget.podcastLocal.rssUrl.launchUrl; widget.podcastLocal.rssUrl.launchUrl;
break; break;
case 2: case 2:
Navigator.push( generalSheet(
context, context,
MaterialPageRoute( title: s.settings,
fullscreenDialog: true, child: PodcastSetting(podcastLocal: widget.podcastLocal),
builder: (context) =>
PodcastSetting(podcastLocal: widget.podcastLocal),
),
); );
break; break;
} }

View File

@ -3,7 +3,6 @@ import 'dart:io';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:image/image.dart' as img; import 'package:image/image.dart' as img;
@ -118,7 +117,8 @@ class _PodcastSettingState extends State<PodcastSetting> {
} }
if (imageUrl != null && if (imageUrl != null &&
imageUrl.contains('http') && imageUrl.contains('http') &&
imageUrl != widget.podcastLocal.imageUrl) { (imageUrl != widget.podcastLocal.imageUrl ||
!File(widget.podcastLocal.imageUrl).existsSync())) {
try { try {
img.Image thumbnail; img.Image thumbnail;
var imageResponse = await Dio().get<List<int>>(imageUrl, var imageResponse = await Dio().get<List<int>>(imageUrl,
@ -173,13 +173,13 @@ class _PodcastSettingState extends State<PodcastSetting> {
Widget _getRefreshStatusIcon(RefreshCoverStatus status) { Widget _getRefreshStatusIcon(RefreshCoverStatus status) {
switch (status) { switch (status) {
case RefreshCoverStatus.none: case RefreshCoverStatus.none:
return Icon(Icons.refresh); return Center();
break; break;
case RefreshCoverStatus.start: case RefreshCoverStatus.start:
return CircularProgressIndicator(strokeWidth: 2); return CircularProgressIndicator(strokeWidth: 2);
break; break;
case RefreshCoverStatus.complete: case RefreshCoverStatus.complete:
return Icon(Icons.refresh); return Icon(Icons.done);
break; break;
case RefreshCoverStatus.complete: case RefreshCoverStatus.complete:
return Icon(Icons.refresh, color: Colors.red); return Icon(Icons.refresh, color: Colors.red);
@ -192,23 +192,7 @@ class _PodcastSettingState extends State<PodcastSetting> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final s = context.s; final s = context.s;
return AnnotatedRegion<SystemUiOverlayStyle>( return Column(
value: SystemUiOverlayStyle(
statusBarIconBrightness: Theme.of(context).accentColorBrightness,
systemNavigationBarColor: Theme.of(context).primaryColor,
systemNavigationBarIconBrightness:
Theme.of(context).accentColorBrightness,
),
child: Scaffold(
appBar: AppBar(
title: Text(s.settings),
elevation: 0,
backgroundColor: Theme.of(context).primaryColor,
),
body: Container(
child: SingleChildScrollView(
scrollDirection: Axis.vertical,
child: Column(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: <Widget>[ children: <Widget>[
@ -218,22 +202,34 @@ class _PodcastSettingState extends State<PodcastSetting> {
builder: (context, snapshot) { builder: (context, snapshot) {
return ListTile( return ListTile(
onTap: () => _setAutoDownload(!snapshot.data), onTap: () => _setAutoDownload(!snapshot.data),
contentPadding: EdgeInsets.fromLTRB(70.0, 10, 20, 10), leading: SizedBox(
height: 18,
width: 18,
child: CustomPaint(
painter: DownloadPainter(
color: context.brightness == Brightness.light
? Colors.grey[600]
: Colors.white,
fraction: 0,
progressColor: context.accentColor,
),
),
),
title: Text(s.autoDownload), title: Text(s.autoDownload),
trailing: Transform.scale( trailing: Transform.scale(
scale: 0.9, scale: 0.9,
child: Switch( child: Switch(
value: snapshot.data, value: snapshot.data, onChanged: _setAutoDownload),
onChanged: _setAutoDownload),
), ),
); );
}), }),
Divider(height: 2), Divider(height: 1),
FutureBuilder<int>( FutureBuilder<int>(
future: _getSkipSecond(widget.podcastLocal.id), future: _getSkipSecond(widget.podcastLocal.id),
initialData: 0, initialData: 0,
builder: (context, snapshot) => ListTile( builder: (context, snapshot) => ListTile(
onTap: () => generalDialog( onTap: () {
generalDialog(
context, context,
title: Text(s.skipSecondsAtStart, maxLines: 2), title: Text(s.skipSecondsAtStart, maxLines: 2),
content: DurationPicker( content: DurationPicker(
@ -262,51 +258,62 @@ class _PodcastSettingState extends State<PodcastSetting> {
), ),
) )
], ],
), ).then((value) => setState(() {}));
contentPadding: EdgeInsets.fromLTRB(70.0, 10, 40, 10), },
leading: Icon(Icons.fast_forward),
title: Text(s.skipSecondsAtStart), title: Text(s.skipSecondsAtStart),
trailing: Text(snapshot.data.toTime), trailing: Padding(
padding: const EdgeInsets.only(right: 10.0),
child: Text(snapshot.data.toTime),
), ),
), ),
Divider(height: 2), ),
Divider(height: 1),
ListTile( ListTile(
onTap: () { onTap: () {
if (_markStatus != MarkStatus.start) { if (_markStatus != MarkStatus.start) {
_confirmMarkListened(context); _confirmMarkListened(context);
} }
}, },
contentPadding: EdgeInsets.fromLTRB(70.0, 10, 40, 10),
title: Text(s.menuMarkAllListened), title: Text(s.menuMarkAllListened),
// subtitle: Text(s.settingsAutoPlayDes), leading: SizedBox(
trailing: SizedBox( height: 20,
width: 20,
child: CustomPaint(
painter: ListenedAllPainter(
context.brightness == Brightness.light
? Colors.grey[600]
: Colors.white,
stroke: 2),
),
),
trailing: Padding(
padding: const EdgeInsets.only(right: 10.0),
child: SizedBox(
height: 20, height: 20,
width: 20, width: 20,
child: _markStatus == MarkStatus.none child: _markStatus == MarkStatus.none
? CustomPaint( ? Center()
painter: ListenedAllPainter(context.textColor,
stroke: 2),
)
: _markStatus == MarkStatus.start : _markStatus == MarkStatus.start
? CircularProgressIndicator(strokeWidth: 2) ? CircularProgressIndicator(strokeWidth: 2)
: Icon(Icons.done))), : Icon(Icons.done)),
Divider(height: 2), )),
Divider(height: 1),
ListTile( ListTile(
onTap: () { onTap: () {
if (_coverStatus != RefreshCoverStatus.start) { if (_coverStatus != RefreshCoverStatus.start) {
_refreshArtWork(); _refreshArtWork();
} }
}, },
contentPadding: EdgeInsets.fromLTRB(70.0, 10, 40, 10),
title: Text(s.refreshArtwork), title: Text(s.refreshArtwork),
leading: Icon(Icons.refresh),
trailing: SizedBox( trailing: SizedBox(
height: 20, height: 20,
width: 20, width: 20,
child: _getRefreshStatusIcon(_coverStatus))), child: Padding(
Divider(height: 2), padding: const EdgeInsets.only(right: 10.0),
]), child: _getRefreshStatusIcon(_coverStatus)))),
), Divider(height: 1),
), ]);
),
);
} }
} }

View File

@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:intl/intl_standalone.dart'; import 'package:intl/intl_standalone.dart';
import 'package:url_launcher/url_launcher.dart';
import '../generated/l10n.dart'; import '../generated/l10n.dart';
import '../local_storage/key_value_storage.dart'; import '../local_storage/key_value_storage.dart';
@ -16,14 +15,6 @@ class LanguagesSetting extends StatefulWidget {
} }
class _LanguagesSettingState extends State<LanguagesSetting> { class _LanguagesSettingState extends State<LanguagesSetting> {
_launchUrl(String url) async {
if (await canLaunch(url)) {
await launch(url);
} else {
throw 'Could not launch $url';
}
}
_setLocale(Locale locale, {bool systemDefault = false}) async { _setLocale(Locale locale, {bool systemDefault = false}) async {
var localeStorage = KeyValueStorage(localeKey); var localeStorage = KeyValueStorage(localeKey);
if (systemDefault) { if (systemDefault) {
@ -61,22 +52,7 @@ class _LanguagesSettingState extends State<LanguagesSetting> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final s = context.s; final s = context.s;
return AnnotatedRegion<SystemUiOverlayStyle>( return Column(
value: SystemUiOverlayStyle(
statusBarIconBrightness: Theme.of(context).accentColorBrightness,
systemNavigationBarColor: Theme.of(context).primaryColor,
systemNavigationBarIconBrightness:
Theme.of(context).accentColorBrightness,
),
child: Scaffold(
appBar: AppBar(
title: Text(s.settingsLanguages),
elevation: 0,
backgroundColor: Theme.of(context).primaryColor,
),
body: SingleChildScrollView(
scrollDirection: Axis.vertical,
child: Column(
children: [ children: [
ListTile( ListTile(
title: Text( title: Text(
@ -88,52 +64,53 @@ class _LanguagesSettingState extends State<LanguagesSetting> {
), ),
onTap: () => onTap: () =>
_setLocale(Locale(Intl.systemLocale), systemDefault: true), _setLocale(Locale(Intl.systemLocale), systemDefault: true),
contentPadding: const EdgeInsets.only(left: 70, right: 20), contentPadding: const EdgeInsets.only(left: 20, right: 20),
), ),
Divider(height: 2), Divider(height: 1),
ListTile( ListTile(
title: Text('English'), title: Text('English'),
onTap: () => _setLocale(Locale('en')), onTap: () => _setLocale(Locale('en')),
contentPadding: const EdgeInsets.only(left: 70, right: 20), contentPadding: const EdgeInsets.only(left: 20, right: 20),
trailing: Radio<Locale>( trailing: Radio<Locale>(
value: Locale('en'), value: Locale('en'),
groupValue: Locale(Intl.getCurrentLocale()), groupValue: Locale(Intl.getCurrentLocale()),
onChanged: _setLocale)), onChanged: _setLocale)),
Divider(height: 2), Divider(height: 1),
ListTile( ListTile(
title: Text('简体中文'), title: Text('简体中文'),
onTap: () => _setLocale(Locale('zh_Hans')), onTap: () => _setLocale(Locale('zh_Hans')),
contentPadding: const EdgeInsets.only(left: 70, right: 20), contentPadding: const EdgeInsets.only(left: 20, right: 20),
trailing: Radio<Locale>( trailing: Radio<Locale>(
value: Locale('zh_Hans'), value: Locale('zh_Hans'),
groupValue: Locale(Intl.getCurrentLocale()), groupValue: Locale(Intl.getCurrentLocale()),
onChanged: _setLocale, onChanged: _setLocale,
)), )),
Divider(height: 2), Divider(height: 1),
ListTile( ListTile(
title: Text('Français'), title: Text('Français'),
onTap: () => _setLocale(Locale('fr')), onTap: () => _setLocale(Locale('fr')),
contentPadding: const EdgeInsets.only(left: 70, right: 20), contentPadding: const EdgeInsets.only(left: 20, right: 20),
trailing: Radio<Locale>( trailing: Radio<Locale>(
value: Locale('fr'), value: Locale('fr'),
groupValue: Locale(Intl.getCurrentLocale()), groupValue: Locale(Intl.getCurrentLocale()),
onChanged: _setLocale), onChanged: _setLocale),
), ),
Divider(height: 2), Divider(height: 1),
ListTile( ListTile(
title: Text('Español'), title: Text('Español'),
onTap: () => _setLocale(Locale('es')), onTap: () => _setLocale(Locale('es')),
contentPadding: const EdgeInsets.only(left: 70, right: 20), contentPadding: const EdgeInsets.only(left: 20, right: 20),
trailing: Radio<Locale>( trailing: Radio<Locale>(
value: Locale('es'), value: Locale('es'),
groupValue: Locale(Intl.getCurrentLocale()), groupValue: Locale(Intl.getCurrentLocale()),
onChanged: _setLocale), onChanged: _setLocale),
), ),
Divider(height: 2), Divider(height: 1),
ListTile( ListTile(
onTap: () => _launchUrl( onTap: () =>
'mailto:<tsacdop.app@gmail.com>?subject=Tsacdop localization project'), 'mailto:<tsacdop.app@gmail.com>?subject=Tsacdop localization project'
contentPadding: const EdgeInsets.only(left: 70, right: 20), .launchUrl,
contentPadding: const EdgeInsets.only(left: 20, right: 20),
title: Align( title: Align(
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
child: Image( child: Image(
@ -146,9 +123,6 @@ class _LanguagesSettingState extends State<LanguagesSetting> {
"If you'd like to contribute to localization project, please contact me."), "If you'd like to contribute to localization project, please contact me."),
), ),
], ],
),
),
),
); );
} }
} }

View File

@ -1,16 +1,14 @@
import 'dart:math' as math;
import 'package:feature_discovery/feature_discovery.dart'; import 'package:feature_discovery/feature_discovery.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:line_icons/line_icons.dart'; import 'package:line_icons/line_icons.dart';
import 'package:url_launcher/url_launcher.dart';
import '../home/home.dart'; import '../home/home.dart';
import '../intro_slider/app_intro.dart'; import '../intro_slider/app_intro.dart';
import '../podcasts/podcast_manage.dart'; import '../podcasts/podcast_manage.dart';
import '../util/extension_helper.dart'; import '../util/extension_helper.dart';
import '../util/general_dialog.dart';
import 'data_backup.dart'; import 'data_backup.dart';
import 'history.dart'; import 'history.dart';
import 'languages.dart'; import 'languages.dart';
@ -26,58 +24,19 @@ class Settings extends StatefulWidget {
_SettingsState createState() => _SettingsState(); _SettingsState createState() => _SettingsState();
} }
class _SettingsState extends State<Settings> class _SettingsState extends State<Settings> {
with SingleTickerProviderStateMixin { Widget _feedbackItem(IconData icon, String name, String url) => ListTile(
_launchUrl(String url) async { onTap: () {
if (await canLaunch(url)) { url.launchUrl;
await launch(url); Navigator.pop(context);
} else { },
throw 'Could not launch $url'; leading: Icon(
}
}
bool _showFeedback;
Animation _animation;
AnimationController _controller;
double _value;
@override
void initState() {
super.initState();
_showFeedback = false;
_value = 0;
_controller =
AnimationController(vsync: this, duration: Duration(milliseconds: 300));
_animation = Tween<double>(begin: 0.0, end: 1.0).animate(_controller)
..addListener(() {
setState(() {
_value = _animation.value;
});
});
}
Widget _feedbackItem(IconData icon, String name, String url) => Material(
color: Colors.transparent,
child: InkWell(
onTap: () => _launchUrl(url),
child: Container(
padding: EdgeInsets.all(5),
alignment: Alignment.center,
child: Column(
children: <Widget>[
Icon(
icon, icon,
size: 20 * _value, size: 20,
), ),
Padding( title: Text(
padding: EdgeInsets.symmetric(vertical: 5),
),
Text(
name, name,
maxLines: 2, maxLines: 2,
)
],
),
),
), ),
); );
@ -139,7 +98,7 @@ class _SettingsState extends State<Settings>
title: Text(s.settingsAppearance), title: Text(s.settingsAppearance),
subtitle: Text(s.settingsAppearanceDes), subtitle: Text(s.settingsAppearanceDes),
), ),
Divider(height: 2), Divider(height: 1),
ListTile( ListTile(
onTap: () => Navigator.push( onTap: () => Navigator.push(
context, context,
@ -152,7 +111,7 @@ class _SettingsState extends State<Settings>
title: Text(s.settingsLayout), title: Text(s.settingsLayout),
subtitle: Text(s.settingsLayoutDes), subtitle: Text(s.settingsLayoutDes),
), ),
Divider(height: 2), Divider(height: 1),
ListTile( ListTile(
onTap: () => Navigator.push( onTap: () => Navigator.push(
context, context,
@ -165,7 +124,7 @@ class _SettingsState extends State<Settings>
title: Text(s.play), title: Text(s.play),
subtitle: Text(s.settingsPlayDes), subtitle: Text(s.settingsPlayDes),
), ),
Divider(height: 2), Divider(height: 1),
ListTile( ListTile(
onTap: () => Navigator.push( onTap: () => Navigator.push(
context, context,
@ -177,7 +136,7 @@ class _SettingsState extends State<Settings>
color: Colors.yellow[700]), color: Colors.yellow[700]),
title: Text(s.settingsSyncing), title: Text(s.settingsSyncing),
subtitle: Text(s.settingsSyncingDes)), subtitle: Text(s.settingsSyncingDes)),
Divider(height: 2), Divider(height: 1),
ListTile( ListTile(
onTap: () => Navigator.push( onTap: () => Navigator.push(
context, context,
@ -190,7 +149,7 @@ class _SettingsState extends State<Settings>
title: Text(s.settingStorage), title: Text(s.settingStorage),
subtitle: Text(s.settingsStorageDes), subtitle: Text(s.settingsStorageDes),
), ),
Divider(height: 2), Divider(height: 1),
ListTile( ListTile(
onTap: () => Navigator.push( onTap: () => Navigator.push(
context, context,
@ -203,12 +162,12 @@ class _SettingsState extends State<Settings>
title: Text(s.settingsHistory), title: Text(s.settingsHistory),
subtitle: Text(s.settingsHistoryDes), subtitle: Text(s.settingsHistoryDes),
), ),
Divider(height: 2), Divider(height: 1),
ListTile( ListTile(
onTap: () => Navigator.push( onTap: () => generalSheet(context,
context, title: s.settingsLanguages,
MaterialPageRoute( child: LanguagesSetting())
builder: (context) => LanguagesSetting())), .then((value) => setState(() {})),
contentPadding: contentPadding:
EdgeInsets.symmetric(horizontal: 25.0), EdgeInsets.symmetric(horizontal: 25.0),
leading: Icon(LineIcons.language_solid, leading: Icon(LineIcons.language_solid,
@ -216,7 +175,7 @@ class _SettingsState extends State<Settings>
title: Text(s.settingsLanguages), title: Text(s.settingsLanguages),
subtitle: Text(s.settingsLanguagesDes), subtitle: Text(s.settingsLanguagesDes),
), ),
Divider(height: 2), Divider(height: 1),
ListTile( ListTile(
onTap: () { onTap: () {
//_exportOmpl(context); //_exportOmpl(context);
@ -232,7 +191,7 @@ class _SettingsState extends State<Settings>
title: Text(s.settingsBackup), title: Text(s.settingsBackup),
subtitle: Text(s.settingsBackupDes), subtitle: Text(s.settingsBackupDes),
), ),
Divider(height: 2), Divider(height: 1),
], ],
), ),
], ],
@ -271,57 +230,45 @@ class _SettingsState extends State<Settings>
title: Text(s.settingsLibraries), title: Text(s.settingsLibraries),
subtitle: Text(s.settingsLibrariesDes), subtitle: Text(s.settingsLibrariesDes),
), ),
Divider(height: 2), Divider(height: 1),
ListTile( ListTile(
onTap: () async { onTap: () => generalSheet(
if (_value == 0) { context,
_showFeedback = !_showFeedback; title: s.settingsFeedback,
_controller.forward(); child: Column(
} else { mainAxisSize: MainAxisSize.min,
await _controller.reverse(); mainAxisAlignment: MainAxisAlignment.start,
_showFeedback = !_showFeedback; children: [
} _feedbackItem(
}, LineIcons.github,
s.feedbackGithub,
'https://github.com/stonega/tsacdop/issues'),
Divider(height: 1),
_feedbackItem(
LineIcons.telegram,
s.feedbackTelegram,
'https://t.me/joinchat/Bk3LkRpTHy40QYC78PK7Qg'),
Divider(height: 1),
_feedbackItem(
LineIcons.envelope_open_text_solid,
s.feedbackEmail,
'mailto:<tsacdop.app@gmail.com>?subject=Tsacdop Feedback'),
Divider(height: 1),
_feedbackItem(
LineIcons.google_play,
s.feedbackPlay,
'https://play.google.com/store/apps/details?id=com.stonegate.tsacdop'),
Divider(height: 1),
],
),
),
contentPadding: contentPadding:
EdgeInsets.symmetric(horizontal: 25.0), EdgeInsets.symmetric(horizontal: 25.0),
leading: Icon(LineIcons.bug_solid, leading: Icon(LineIcons.bug_solid,
color: Colors.pink[700]), color: Colors.pink[700]),
title: Text(s.settingsFeedback), title: Text(s.settingsFeedback),
subtitle: Text(s.settingsFeedbackDes), subtitle: Text(s.settingsFeedbackDes),
trailing: Transform.rotate(
angle: math.pi * _value,
child: Icon(Icons.keyboard_arrow_down),
), ),
),
_showFeedback
? SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
SizedBox(width: 45),
_feedbackItem(
LineIcons.github,
s.feedbackGithub,
'https://github.com/stonega/tsacdop/issues'),
_feedbackItem(
LineIcons.telegram,
s.feedbackTelegram,
'https://t.me/joinchat/Bk3LkRpTHy40QYC78PK7Qg'),
_feedbackItem(
LineIcons.envelope_open_text_solid,
s.feedbackEmail,
'mailto:<tsacdop.app@gmail.com>?subject=Tsacdop Feedback'),
_feedbackItem(
LineIcons.google_play,
s.feedbackPlay,
'https://play.google.com/store/apps/details?id=com.stonegate.tsacdop')
],
),
)
: Center(),
Divider( Divider(
height: 2, height: 2,
), ),
@ -349,7 +296,7 @@ class _SettingsState extends State<Settings>
color: Colors.pinkAccent), color: Colors.pinkAccent),
title: Text(s.settingsDiscovery), title: Text(s.settingsDiscovery),
), ),
Divider(height: 2), Divider(height: 1),
ListTile( ListTile(
onTap: () => Navigator.push( onTap: () => Navigator.push(
context, context,
@ -362,7 +309,7 @@ class _SettingsState extends State<Settings>
color: Colors.blueGrey), color: Colors.blueGrey),
title: Text(s.settingsAppIntro), title: Text(s.settingsAppIntro),
), ),
Divider(height: 2), Divider(height: 1),
], ],
), ),
Padding( Padding(

View File

@ -3,9 +3,9 @@ import 'package:flutter/services.dart';
import 'extension_helper.dart'; import 'extension_helper.dart';
generalDialog(BuildContext context, Future generalDialog(BuildContext context,
{Widget title, Widget content, List<Widget> actions}) => {Widget title, Widget content, List<Widget> actions}) async =>
showGeneralDialog( await showGeneralDialog(
context: context, context: context,
barrierDismissible: true, barrierDismissible: true,
barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel, barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
@ -15,20 +15,51 @@ generalDialog(BuildContext context,
AnnotatedRegion<SystemUiOverlayStyle>( AnnotatedRegion<SystemUiOverlayStyle>(
value: SystemUiOverlayStyle( value: SystemUiOverlayStyle(
statusBarIconBrightness: Brightness.light, statusBarIconBrightness: Brightness.light,
systemNavigationBarColor: systemNavigationBarColor: context.brightness == Brightness.light
Theme.of(context).brightness == Brightness.light
? Color.fromRGBO(113, 113, 113, 1) ? Color.fromRGBO(113, 113, 113, 1)
: Color.fromRGBO(15, 15, 15, 1), : Color.fromRGBO(15, 15, 15, 1),
), ),
child: AlertDialog( child: AlertDialog(
elevation: 2, elevation: 2,
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(10.0))), borderRadius: BorderRadius.circular(10.0)),
titlePadding: EdgeInsets.all(20), titlePadding: EdgeInsets.all(20),
title: SizedBox(width: context.width - 160, child: title), title: SizedBox(width: context.width - 120, child: title),
content: content, content: content,
contentPadding: EdgeInsets.fromLTRB(20, 0, 20, 0), contentPadding: EdgeInsets.fromLTRB(20, 0, 20, 0),
actionsPadding: EdgeInsets.fromLTRB(10, 0, 10, 0),
actions: actions), actions: actions),
), ),
); );
Future generalSheet(BuildContext context, {Widget child, String title}) async =>
await showModalBottomSheet(
isScrollControlled: true,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(16.0), topRight: Radius.circular(16.0)),
),
elevation: 2,
context: context,
builder: (context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
Padding(
padding: EdgeInsets.only(top: 10.0, bottom: 2.0),
child: Container(
height: 4,
width: 25,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(2.0),
color: context.primaryColorDark),
),
),
Padding(
padding: EdgeInsets.symmetric(vertical: 6.0),
child: Text(title, style: context.textTheme.headline6),
),
Divider(height: 1),
child,
],
);
});