- AppDatabase with schemaVersion 1, in-memory executor for testing - Database provider with @Riverpod(keepAlive: true) - AppTheme with sage green seed ColorScheme and warm surface overrides - ThemeNotifier with SharedPreferences persistence, defaults to system - Full German ARB localization (15 keys) with proper umlauts - Minimal main.dart with ProviderScope placeholder - Drift schema v1 captured via make-migrations - All .g.dart files generated via build_runner - Wave 0 tests: database (3), color scheme (6), theme (3), localization (2) -- 14 total, all passing Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
54 lines
1.3 KiB
Dart
54 lines
1.3 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
|
|
part 'theme_provider.g.dart';
|
|
|
|
const _themeModeKey = 'theme_mode';
|
|
|
|
@riverpod
|
|
class ThemeNotifier extends _$ThemeNotifier {
|
|
@override
|
|
ThemeMode build() {
|
|
_loadPersistedThemeMode();
|
|
return ThemeMode.system;
|
|
}
|
|
|
|
Future<void> _loadPersistedThemeMode() async {
|
|
final prefs = await SharedPreferences.getInstance();
|
|
final persisted = prefs.getString(_themeModeKey);
|
|
if (persisted != null) {
|
|
state = _themeModeFromString(persisted);
|
|
}
|
|
}
|
|
|
|
Future<void> setThemeMode(ThemeMode mode) async {
|
|
state = mode;
|
|
final prefs = await SharedPreferences.getInstance();
|
|
await prefs.setString(_themeModeKey, _themeModeToString(mode));
|
|
}
|
|
|
|
static ThemeMode _themeModeFromString(String? value) {
|
|
switch (value) {
|
|
case 'light':
|
|
return ThemeMode.light;
|
|
case 'dark':
|
|
return ThemeMode.dark;
|
|
case 'system':
|
|
default:
|
|
return ThemeMode.system;
|
|
}
|
|
}
|
|
|
|
static String _themeModeToString(ThemeMode mode) {
|
|
switch (mode) {
|
|
case ThemeMode.light:
|
|
return 'light';
|
|
case ThemeMode.dark:
|
|
return 'dark';
|
|
case ThemeMode.system:
|
|
return 'system';
|
|
}
|
|
}
|
|
}
|