You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter应用重启后主题模式重置,如何实现主题状态持久化?

解决Flutter主题模式重启后重置的问题

主题模式重启后恢复默认,是因为你没把用户的选择保存到本地。要解决这个问题,关键是把用户选的主题存在本地存储里,启动时再读出来应用上。具体操作步骤如下:

1. 添加本地存储依赖

用Flutter官方的shared_preferences包做轻量数据持久化,在pubspec.yaml里加依赖:

dependencies:
  flutter:
    sdk: flutter
  shared_preferences: ^2.2.2 # 版本号以官方最新为准

执行flutter pub get安装依赖。

2. 修改ThemeManager实现

假设你用的ThemeManager是继承ChangeNotifier的状态管理类,给它加保存主题和启动读主题的逻辑:

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

class ThemeManager extends ChangeNotifier {
  ThemeMode _themeMode = ThemeMode.system;

  // 启动时自动加载本地保存的主题
  ThemeManager() {
    _loadSavedTheme();
  }

  ThemeMode get themeMode => _themeMode;

  // 切换主题时同步存到本地
  void toggleTheme(bool isDark) {
    _themeMode = isDark ? ThemeMode.dark : ThemeMode.light;
    _saveTheme();
    notifyListeners();
  }

  // 从本地读取之前保存的主题设置
  Future<void> _loadSavedTheme() async {
    final prefs = await SharedPreferences.getInstance();
    final savedIsDark = prefs.getBool('isDarkTheme');
    
    if (savedIsDark != null) {
      _themeMode = savedIsDark ? ThemeMode.dark : ThemeMode.light;
    } else {
      // 没存过设置的话,默认跟着系统走
      _themeMode = ThemeMode.system;
    }
    notifyListeners();
  }

  // 把当前主题存到本地
  Future<void> _saveTheme() async {
    final prefs = await SharedPreferences.getInstance();
    await prefs.setBool('isDarkTheme', _themeMode == ThemeMode.dark);
  }
}

3. 确保启动时加载主题

在main.dart里,先初始化ThemeManager(让它读完本地主题),再启动应用:

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

void main() async {
  // 必须先初始化Flutter绑定,才能调用异步方法
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化ThemeManager,此时会自动读本地保存的主题
  final themeManager = ThemeManager();
  
  runApp(MyApp(themeManager: themeManager));
}

class MyApp extends StatelessWidget {
  final ThemeManager themeManager;

  const MyApp({super.key, required this.themeManager});

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider.value(
      value: themeManager,
      child: MaterialApp(
        title: 'Flutter Theme Demo',
        theme: ThemeData.light(), // 你的浅色主题配置
        darkTheme: ThemeData.dark(), // 你的深色主题配置
        themeMode: themeManager.themeMode, // 让ThemeManager控制当前主题
        home: const LoginScreen(),
      ),
    );
  }
}

4. 现有设置页面不用改

你当前的主题设置页面代码完全可以保留,因为ThemeManager启动时已经加载了保存的主题,themeListener会自动监听变化更新UI。

这样改完后,用户切换主题时设置会存在本地,下次打开应用就会自动恢复之前选的模式了。

内容的提问来源于stack exchange,提问作者It'sPhil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 10:06:22