feat: save brightness settings
This commit is contained in:
parent
cd38d96a91
commit
dd093bc7f7
|
@ -144,7 +144,7 @@ class _HomeState extends State<Home> {
|
||||||
final theme = Provider.of<ThemeModel>(context);
|
final theme = Provider.of<ThemeModel>(context);
|
||||||
|
|
||||||
final themData = ThemeData(
|
final themData = ThemeData(
|
||||||
brightness: theme.brightness,
|
brightness: theme.brightnessEnum,
|
||||||
primaryColor: Colors.white,
|
primaryColor: Colors.white,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -162,7 +162,7 @@ class _HomeState extends State<Home> {
|
||||||
case AppThemeType.cupertino:
|
case AppThemeType.cupertino:
|
||||||
return CupertinoApp(
|
return CupertinoApp(
|
||||||
theme: CupertinoThemeData(
|
theme: CupertinoThemeData(
|
||||||
brightness: theme.brightness,
|
brightness: theme.brightnessEnum,
|
||||||
primaryColor: theme.palette.primary,
|
primaryColor: theme.palette.primary,
|
||||||
),
|
),
|
||||||
home: CupertinoTabScaffold(
|
home: CupertinoTabScaffold(
|
||||||
|
|
|
@ -20,6 +20,17 @@ class AppThemeType {
|
||||||
static const values = [AppThemeType.material, AppThemeType.cupertino];
|
static const values = [AppThemeType.material, AppThemeType.cupertino];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class AppBrightnessType {
|
||||||
|
// static const followSystem = 0;
|
||||||
|
static const light = 1;
|
||||||
|
static const dark = 2;
|
||||||
|
static const values = [
|
||||||
|
// AppBrightnessType.followSystem,
|
||||||
|
AppBrightnessType.light,
|
||||||
|
AppBrightnessType.dark
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
class PickerItem<T> {
|
class PickerItem<T> {
|
||||||
final T value;
|
final T value;
|
||||||
final String text;
|
final String text;
|
||||||
|
@ -86,25 +97,38 @@ class Palette {
|
||||||
}
|
}
|
||||||
|
|
||||||
class ThemeModel with ChangeNotifier {
|
class ThemeModel with ChangeNotifier {
|
||||||
static const storageKey = 'theme';
|
static const kTheme = 'theme';
|
||||||
|
static const kBrightness = 'brightness';
|
||||||
|
|
||||||
int _theme;
|
int _theme;
|
||||||
int get theme => _theme;
|
int get theme => _theme;
|
||||||
bool get ready => _theme != null;
|
bool get ready => _theme != null;
|
||||||
|
|
||||||
Brightness _brightness = Brightness.light;
|
int _brightnessValue = AppBrightnessType.light;
|
||||||
Brightness get brightness => _brightness;
|
int get brighnessValue => _brightnessValue;
|
||||||
Future<void> toggleBrightness() async {
|
Brightness get brightnessEnum {
|
||||||
// TODO: Save
|
switch (_brightnessValue) {
|
||||||
_brightness =
|
case AppBrightnessType.light:
|
||||||
_brightness == Brightness.dark ? Brightness.light : Brightness.dark;
|
return Brightness.light;
|
||||||
|
case AppBrightnessType.dark:
|
||||||
|
return Brightness.dark;
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> setBrightness(int v) async {
|
||||||
|
_brightnessValue = v;
|
||||||
|
final prefs = await SharedPreferences.getInstance();
|
||||||
|
await prefs.setInt(kBrightness, v);
|
||||||
|
Fimber.d('write brightness: $v');
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
final router = Router();
|
final router = Router();
|
||||||
|
|
||||||
Palette get palette {
|
Palette get palette {
|
||||||
switch (brightness) {
|
switch (brightnessEnum) {
|
||||||
case Brightness.light:
|
case Brightness.light:
|
||||||
return Palette(
|
return Palette(
|
||||||
primary: Colors.blueAccent.shade700,
|
primary: Colors.blueAccent.shade700,
|
||||||
|
@ -131,9 +155,8 @@ class ThemeModel with ChangeNotifier {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> init() async {
|
Future<void> init() async {
|
||||||
var prefs = await SharedPreferences.getInstance();
|
final prefs = await SharedPreferences.getInstance();
|
||||||
|
final v = prefs.getInt(kTheme);
|
||||||
int v = prefs.getInt(storageKey);
|
|
||||||
Fimber.d('read theme: $v');
|
Fimber.d('read theme: $v');
|
||||||
if (AppThemeType.values.contains(v)) {
|
if (AppThemeType.values.contains(v)) {
|
||||||
_theme = v;
|
_theme = v;
|
||||||
|
@ -142,17 +165,20 @@ class ThemeModel with ChangeNotifier {
|
||||||
} else {
|
} else {
|
||||||
_theme = AppThemeType.material;
|
_theme = AppThemeType.material;
|
||||||
}
|
}
|
||||||
|
final b = prefs.getInt(kBrightness);
|
||||||
|
Fimber.d('read brightness: $b');
|
||||||
|
if (AppBrightnessType.values.contains(b)) {
|
||||||
|
_brightnessValue = b;
|
||||||
|
}
|
||||||
|
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> setTheme(int v) async {
|
Future<void> setTheme(int v) async {
|
||||||
SharedPreferences prefs = await SharedPreferences.getInstance();
|
|
||||||
|
|
||||||
_theme = v;
|
_theme = v;
|
||||||
await prefs.setInt(storageKey, v);
|
final prefs = await SharedPreferences.getInstance();
|
||||||
|
await prefs.setInt(kTheme, v);
|
||||||
Fimber.d('write theme: $v');
|
Fimber.d('write theme: $v');
|
||||||
|
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@ class CommonScaffold extends StatelessWidget {
|
||||||
default:
|
default:
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
brightness: theme.brightness,
|
brightness: theme.brightnessEnum,
|
||||||
title: title,
|
title: title,
|
||||||
actions: [
|
actions: [
|
||||||
if (action != null) action,
|
if (action != null) action,
|
||||||
|
|
|
@ -53,17 +53,17 @@ class NewsScreenState extends State<NewsScreen> {
|
||||||
Widget build(context) {
|
Widget build(context) {
|
||||||
return ListStatefulScaffold<GithubEvent, int>(
|
return ListStatefulScaffold<GithubEvent, int>(
|
||||||
title: AppBarTitle('News'),
|
title: AppBarTitle('News'),
|
||||||
actionBuilder: () {
|
// actionBuilder: () {
|
||||||
return ActionEntry(
|
// return ActionEntry(
|
||||||
iconData:
|
// iconData:
|
||||||
Provider.of<ThemeModel>(context).brightness == Brightness.dark
|
// Provider.of<ThemeModel>(context).brightness == Brightness.dark
|
||||||
? Ionicons.md_sunny
|
// ? Ionicons.md_sunny
|
||||||
: Ionicons.md_moon,
|
// : Ionicons.md_moon,
|
||||||
onTap: () {
|
// onTap: () {
|
||||||
Provider.of<ThemeModel>(context).toggleBrightness();
|
// Provider.of<ThemeModel>(context).toggleBrightness();
|
||||||
},
|
// },
|
||||||
);
|
// );
|
||||||
},
|
// },
|
||||||
itemBuilder: (payload) => EventItem(payload),
|
itemBuilder: (payload) => EventItem(payload),
|
||||||
onRefresh: fetchEvents,
|
onRefresh: fetchEvents,
|
||||||
onLoadMore: (page) => fetchEvents(page),
|
onLoadMore: (page) => fetchEvents(page),
|
||||||
|
|
|
@ -169,7 +169,7 @@ class ObjectScreen extends StatelessWidget {
|
||||||
child: HighlightView(
|
child: HighlightView(
|
||||||
text,
|
text,
|
||||||
language: _language,
|
language: _language,
|
||||||
theme: themeMap[theme.brightness == Brightness.dark
|
theme: themeMap[theme.brightnessEnum == Brightness.dark
|
||||||
? codeProvider.themeDark
|
? codeProvider.themeDark
|
||||||
: codeProvider.theme],
|
: codeProvider.theme],
|
||||||
padding: CommonStyle.padding,
|
padding: CommonStyle.padding,
|
||||||
|
|
|
@ -4,8 +4,9 @@ import 'package:git_touch/models/theme.dart';
|
||||||
import 'package:git_touch/scaffolds/single.dart';
|
import 'package:git_touch/scaffolds/single.dart';
|
||||||
import 'package:git_touch/utils/utils.dart';
|
import 'package:git_touch/utils/utils.dart';
|
||||||
import 'package:git_touch/widgets/app_bar_title.dart';
|
import 'package:git_touch/widgets/app_bar_title.dart';
|
||||||
|
import 'package:git_touch/widgets/table_view.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import '../widgets/table_view.dart';
|
import 'package:tuple/tuple.dart';
|
||||||
|
|
||||||
final settingsRouter = RouterScreen(
|
final settingsRouter = RouterScreen(
|
||||||
'/settings',
|
'/settings',
|
||||||
|
@ -13,15 +14,15 @@ final settingsRouter = RouterScreen(
|
||||||
);
|
);
|
||||||
|
|
||||||
class SettingsScreen extends StatelessWidget {
|
class SettingsScreen extends StatelessWidget {
|
||||||
Widget _buildRightWidget(bool checked) {
|
Widget _buildRightWidget(BuildContext context, bool checked) {
|
||||||
|
final theme = Provider.of<ThemeModel>(context);
|
||||||
if (!checked) return null;
|
if (!checked) return null;
|
||||||
return Icon(Octicons.check, color: CupertinoColors.activeBlue, size: 24);
|
return Icon(Icons.check, color: theme.palette.primary, size: 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
var themeProvider = Provider.of<ThemeModel>(context);
|
final theme = Provider.of<ThemeModel>(context);
|
||||||
|
|
||||||
return SingleScaffold(
|
return SingleScaffold(
|
||||||
title: AppBarTitle('Settings'),
|
title: AppBarTitle('Settings'),
|
||||||
body: Column(
|
body: Column(
|
||||||
|
@ -40,29 +41,45 @@ class SettingsScreen extends StatelessWidget {
|
||||||
TableView(
|
TableView(
|
||||||
headerText: 'APP THEME',
|
headerText: 'APP THEME',
|
||||||
items: [
|
items: [
|
||||||
TableViewItem(
|
Tuple2('Material', AppThemeType.material),
|
||||||
|
Tuple2('Cupertino', AppThemeType.cupertino),
|
||||||
|
].map((t) {
|
||||||
|
return TableViewItem(
|
||||||
text: Text('Material'),
|
text: Text('Material'),
|
||||||
rightWidget: _buildRightWidget(
|
rightWidget: _buildRightWidget(
|
||||||
themeProvider.theme == AppThemeType.material),
|
context,
|
||||||
|
theme.theme == AppThemeType.material,
|
||||||
|
),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
if (themeProvider.theme != AppThemeType.material) {
|
if (theme.theme != AppThemeType.material) {
|
||||||
themeProvider.setTheme(AppThemeType.material);
|
theme.setTheme(AppThemeType.material);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
hideRightChevron: true,
|
hideRightChevron: true,
|
||||||
|
);
|
||||||
|
}).toList(),
|
||||||
),
|
),
|
||||||
TableViewItem(
|
CommonStyle.verticalGap,
|
||||||
text: Text('Cupertino'),
|
TableView(
|
||||||
|
headerText: 'BRIGHTNESS',
|
||||||
|
items: [
|
||||||
|
// Tuple2('Follow System', AppBrightnessType.followSystem),
|
||||||
|
Tuple2('Light', AppBrightnessType.light),
|
||||||
|
Tuple2('Dark', AppBrightnessType.dark),
|
||||||
|
].map((t) {
|
||||||
|
return TableViewItem(
|
||||||
|
text: Text(t.item1),
|
||||||
rightWidget: _buildRightWidget(
|
rightWidget: _buildRightWidget(
|
||||||
themeProvider.theme == AppThemeType.cupertino),
|
context,
|
||||||
|
theme.brighnessValue == t.item2,
|
||||||
|
),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
if (themeProvider.theme != AppThemeType.cupertino) {
|
if (theme.brighnessValue != t.item2)
|
||||||
themeProvider.setTheme(AppThemeType.cupertino);
|
theme.setBrightness(t.item2);
|
||||||
}
|
|
||||||
},
|
},
|
||||||
hideRightChevron: true,
|
hideRightChevron: true,
|
||||||
),
|
);
|
||||||
],
|
}).toList(),
|
||||||
),
|
),
|
||||||
CommonStyle.verticalGap,
|
CommonStyle.verticalGap,
|
||||||
TableView(
|
TableView(
|
||||||
|
|
|
@ -230,7 +230,7 @@ class UserScreen extends StatelessWidget {
|
||||||
spacing: 3,
|
spacing: 3,
|
||||||
children: week.contributionDays.map((day) {
|
children: week.contributionDays.map((day) {
|
||||||
var color = convertColor(day.color);
|
var color = convertColor(day.color);
|
||||||
if (theme.brightness == Brightness.dark) {
|
if (theme.brightnessEnum == Brightness.dark) {
|
||||||
color = Color.fromRGBO(0xff - color.red,
|
color = Color.fromRGBO(0xff - color.red,
|
||||||
0xff - color.green, 0xff - color.blue, 1);
|
0xff - color.green, 0xff - color.blue, 1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:git_touch/models/theme.dart';
|
import 'package:git_touch/models/theme.dart';
|
||||||
|
import 'package:git_touch/widgets/link.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
class AvatarSize {
|
class AvatarSize {
|
||||||
|
@ -37,7 +38,7 @@ class Avatar extends StatelessWidget {
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
if (linkUrl == null) return widget;
|
if (linkUrl == null) return widget;
|
||||||
return GestureDetector(
|
return Link(
|
||||||
child: widget,
|
child: widget,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
Provider.of<ThemeModel>(context).push(context, linkUrl);
|
Provider.of<ThemeModel>(context).push(context, linkUrl);
|
||||||
|
|
Loading…
Reference in New Issue