import 'dart:async'; import 'package:flutter/material.dart'; import 'package:sunny_mochi/core/theme/app_colors.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:shared_preferences/shared_preferences.dart'; part 'theme_notifier.g.dart'; /// 当前色板 Notifier — 对应 iOS AppThemeManager。 /// /// **默认 white**(白色导航栏 + 中性灰背景,对应设计稿默认配色)。 /// 切换持久化到 SharedPreferences,下次启动恢复。 @Riverpod(keepAlive: true) class ThemeNotifier extends _$ThemeNotifier { static const _keyScheme = 'color_scheme'; @override AppColorScheme build() { unawaited(_restore()); return AppColorScheme.white; } /// 切换主题色板(同时持久化) void switchScheme(AppColorScheme scheme) { state = scheme; unawaited( SharedPreferences.getInstance().then( (prefs) => prefs.setString(_keyScheme, scheme.name), ), ); } Future _restore() async { final prefs = await SharedPreferences.getInstance(); final name = prefs.getString(_keyScheme); if (name != null) { state = AppColorScheme.values.firstWhere( (e) => e.name == name, orElse: () => AppColorScheme.white, ); } } } /// 明亮 / 暗色 / 跟随系统 模式(与 iOS UIInterfaceStyle 对齐) @Riverpod(keepAlive: true) class ThemeModeNotifier extends _$ThemeModeNotifier { static const _keyMode = 'theme_mode'; @override ThemeMode build() { unawaited(_restore()); return ThemeMode.light; } void switchMode(ThemeMode mode) { state = mode; unawaited( SharedPreferences.getInstance().then( (prefs) => prefs.setString(_keyMode, mode.name), ), ); } Future _restore() async { final prefs = await SharedPreferences.getInstance(); final name = prefs.getString(_keyMode); if (name != null) { state = ThemeMode.values.firstWhere( (e) => e.name == name, orElse: () => ThemeMode.light, ); } } }