Skip to content

Commit

Permalink
settings tab
Browse files Browse the repository at this point in the history
  • Loading branch information
apoleon33 committed Jan 4, 2024
1 parent 867b689 commit ba334ac
Show file tree
Hide file tree
Showing 6 changed files with 286 additions and 11 deletions.
9 changes: 6 additions & 3 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import 'package:cradle/route/albumCard.dart';
import 'package:cradle/theme_manager.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import 'route/home.dart';

Expand All @@ -15,8 +15,11 @@ class MyApp extends StatelessWidget {

@override
Widget build(BuildContext context) {
return DynamicTheme(
child: const MyHomePage(title: 'CRADLE'),
return ChangeNotifierProvider(
create: (context) => ModeTheme(),
child: DynamicTheme(
child: const MyHomePage(title: 'CRADLE'),
),
);
}
}
71 changes: 71 additions & 0 deletions lib/route/settings.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import 'package:cradle/theme_manager.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';

class Settings extends StatefulWidget {
const Settings({super.key});

@override
State<Settings> createState() => _Settings();
}

class _Settings extends State<Settings> {
int colorMode = 0;

@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
_getSavedColorMode();
});
}

void _getSavedColorMode() async {
final prefs = await SharedPreferences.getInstance();
// if it has never been set, default to 0
setState(() {
colorMode = prefs.getInt('color') ?? 0;
});

print("theme mode: $colorMode");
}

void changeColorMode(int newColorMode) async {}

@override
Widget build(BuildContext context) {
return Center(
child: Column(
children: [
const Text("Theme mode"),
Consumer<ModeTheme>(builder: (context, themeMode, child) {
return SegmentedButton(
segments: const [
ButtonSegment(
value: 0,
label: Text("system"),
icon: Icon(Icons.settings_brightness)),
ButtonSegment(
value: 1,
label: Text("light"),
icon: Icon(Icons.light_mode)),
ButtonSegment(
value: 2, label: Text("dark"), icon: Icon(Icons.dark_mode))
],
selected: <int>{themeMode.themeMode},
onSelectionChanged: (Set<int> newSelection) async {
themeMode.themeMode = newSelection.first;
final prefs = await SharedPreferences.getInstance();
setState(() {
colorMode = newSelection.first;
});
await prefs.setInt('color', newSelection.first);
},
);
})
],
),
);
}
}
62 changes: 55 additions & 7 deletions lib/theme_manager.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import 'dart:collection';

import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';

class DynamicTheme extends StatefulWidget {
Widget child;
Expand All @@ -14,6 +18,7 @@ class DynamicTheme extends StatefulWidget {
class _DynamicTheme extends State<DynamicTheme> {
late ColorScheme currentColorScheme;
late ColorScheme currentDarkColorScheme;
late int themeMode;

@override
void initState() {
Expand All @@ -23,9 +28,22 @@ class _DynamicTheme extends State<DynamicTheme> {
currentDarkColorScheme = const ColorScheme.dark();
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
createTheme(widget.image);

_getThemeModeFromSettings();
});
}

@override
void didChangeDependencies() {
super.didChangeDependencies();
}

void _getThemeModeFromSettings() async {
final prefs = await SharedPreferences.getInstance();

themeMode = prefs.getInt('color') ?? 0;
}

void _getTodayImage() async {
DateTime todayDate = DateTime.now();
Dio dio = Dio();
Expand All @@ -43,13 +61,22 @@ class _DynamicTheme extends State<DynamicTheme> {
Widget build(BuildContext context) {
final ColorScheme lightColorScheme = currentColorScheme;
final ColorScheme darkColorScheme = currentDarkColorScheme;
return MaterialApp(
title: 'Cradle',
theme: ThemeData(useMaterial3: true, colorScheme: lightColorScheme),
darkTheme: ThemeData(useMaterial3: true, colorScheme: darkColorScheme),
themeMode: ThemeMode.system,
debugShowCheckedModeBanner: false,
home: widget.child);
return Consumer<ModeTheme>(
builder: (context, modeTheme, child) {
return MaterialApp(
title: 'Cradle',
theme: ThemeData(useMaterial3: true, colorScheme: lightColorScheme),
darkTheme:
ThemeData(useMaterial3: true, colorScheme: darkColorScheme),
themeMode: (modeTheme.themeMode == 0)
? ThemeMode.system
: (modeTheme.themeMode == 1)
? ThemeMode.light
: ThemeMode.dark,
debugShowCheckedModeBanner: false,
home: widget.child);
},
);
}

Future<void> createTheme(ImageProvider provider) async {
Expand All @@ -65,3 +92,24 @@ class _DynamicTheme extends State<DynamicTheme> {
});
}
}

class ModeTheme extends ChangeNotifier {
int _themeMode = 0;

ModeTheme() {
_initThemeMode();
}

void _initThemeMode() async {
final prefs = await SharedPreferences.getInstance();

themeMode = prefs.getInt('color') ?? 0;
}

int get themeMode => _themeMode;

set themeMode(int newThemeMode) {
_themeMode = newThemeMode;
notifyListeners();
}
}
2 changes: 2 additions & 0 deletions macos/Flutter/GeneratedPluginRegistrant.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import FlutterMacOS
import Foundation

import shared_preferences_foundation

func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
}
151 changes: 150 additions & 1 deletion pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.3.1"
ffi:
dependency: transitive
description:
name: ffi
sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878"
url: "https://pub.dev"
source: hosted
version: "2.1.0"
file:
dependency: transitive
description:
name: file
sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
url: "https://pub.dev"
source: hosted
version: "7.0.0"
flutter:
dependency: "direct main"
description: flutter
Expand All @@ -99,6 +115,11 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
http_parser:
dependency: transitive
description:
Expand Down Expand Up @@ -139,6 +160,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.10.0"
nested:
dependency: transitive
description:
name: nested
sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
palette_generator:
dependency: "direct main"
description:
Expand All @@ -163,6 +192,30 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.1"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
url: "https://pub.dev"
source: hosted
version: "2.2.1"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c"
url: "https://pub.dev"
source: hosted
version: "2.1.1"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170"
url: "https://pub.dev"
source: hosted
version: "2.2.1"
petitparser:
dependency: transitive
description:
Expand All @@ -171,6 +224,86 @@ packages:
url: "https://pub.dev"
source: hosted
version: "6.0.2"
platform:
dependency: transitive
description:
name: platform
sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec"
url: "https://pub.dev"
source: hosted
version: "3.1.4"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
url: "https://pub.dev"
source: hosted
version: "2.1.8"
provider:
dependency: "direct main"
description:
name: provider
sha256: "9a96a0a19b594dbc5bf0f1f27d2bc67d5f95957359b461cd9feb44ed6ae75096"
url: "https://pub.dev"
source: hosted
version: "6.1.1"
shared_preferences:
dependency: "direct main"
description:
name: shared_preferences
sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02"
url: "https://pub.dev"
source: hosted
version: "2.2.2"
shared_preferences_android:
dependency: transitive
description:
name: shared_preferences_android
sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06"
url: "https://pub.dev"
source: hosted
version: "2.2.1"
shared_preferences_foundation:
dependency: transitive
description:
name: shared_preferences_foundation
sha256: "7bf53a9f2d007329ee6f3df7268fd498f8373602f943c975598bbb34649b62a7"
url: "https://pub.dev"
source: hosted
version: "2.3.4"
shared_preferences_linux:
dependency: transitive
description:
name: shared_preferences_linux
sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa"
url: "https://pub.dev"
source: hosted
version: "2.3.2"
shared_preferences_platform_interface:
dependency: transitive
description:
name: shared_preferences_platform_interface
sha256: d4ec5fc9ebb2f2e056c617112aa75dcf92fc2e4faaf2ae999caa297473f75d8a
url: "https://pub.dev"
source: hosted
version: "2.3.1"
shared_preferences_web:
dependency: transitive
description:
name: shared_preferences_web
sha256: "7b15ffb9387ea3e237bb7a66b8a23d2147663d391cafc5c8f37b2e7b4bde5d21"
url: "https://pub.dev"
source: hosted
version: "2.2.2"
shared_preferences_windows:
dependency: transitive
description:
name: shared_preferences_windows
sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59"
url: "https://pub.dev"
source: hosted
version: "2.3.2"
sky_engine:
dependency: transitive
description: flutter
Expand Down Expand Up @@ -272,6 +405,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.3.0"
win32:
dependency: transitive
description:
name: win32
sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8"
url: "https://pub.dev"
source: hosted
version: "5.2.0"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d
url: "https://pub.dev"
source: hosted
version: "1.0.4"
xml:
dependency: transitive
description:
Expand All @@ -282,4 +431,4 @@ packages:
version: "6.5.0"
sdks:
dart: ">=3.2.3 <4.0.0"
flutter: ">=3.7.0"
flutter: ">=3.16.0"
Loading

0 comments on commit ba334ac

Please sign in to comment.