Template
Core 基础设施:Flavor 三包体系、Drift+SQLCipher 加密数据库 7 拦截器 Dio 网络栈、CrashReporter 崩溃日志、Sealed Failure 错误体系 5 色板主题系统、Auth 认证骨架(Clean Architecture)、Dev Panel、Mock Adapter 通过验证:flutter analyze(0 errors)、flutter test(全绿)、staging APK 74.8MB
77 lines
2.0 KiB
Dart
77 lines
2.0 KiB
Dart
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<void> _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<void> _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,
|
|
);
|
|
}
|
|
}
|
|
}
|