Files
SkyJourney 61017f1c39 chore: 初始化脚手架 — sunny_mochi 企业级 Flutter 模板
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
2026-05-14 12:51:05 +08:00

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,
);
}
}
}