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

Flutter中系统深色模式切换时颜色不更新的问题求助

解决方案

1. 核心问题分析

当前代码未监听系统亮度变化事件,且仅依赖本地存储的开关状态控制主题,导致系统切换深色/浅色模式时页面无法同步更新。需要添加系统亮度监听,并调整主题状态的优先级逻辑。

2. 关键修改方案

  • 继承WidgetsBindingObserver监听系统亮度变化
  • 区分手动设置和跟随系统两种状态,手动设置优先级高于系统
  • 系统亮度变化时,仅在用户未手动设置的情况下同步更新页面

修改后的完整代码

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

void main() {
  runApp(MainApp());
}

class MainApp extends StatefulWidget {
  MainApp({super.key});

  @override
  State<MainApp> createState() => _MainAppState();
}

class _MainAppState extends State<MainApp> with WidgetsBindingObserver {
  bool? _manualDarkMode; // null表示跟随系统,true/false表示手动设置深色/浅色

  Future<void> saveManualDarkMode(bool? value) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    if (value == null) {
      await prefs.remove("manualDarkMode");
    } else {
      await prefs.setBool("manualDarkMode", value);
    }
  }

  Future<bool?> getManualDarkMode() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.getBool("manualDarkMode");
  }

  // 获取当前生效的深色模式状态
  bool _getCurrentDarkMode() {
    if (_manualDarkMode != null) {
      return _manualDarkMode!;
    }
    // 未手动设置时跟随系统亮度
    return MediaQuery.of(context).platformBrightness == Brightness.dark;
  }

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
    _loadManualSetting();
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  // 加载本地存储的手动设置
  Future<void> _loadManualSetting() async {
    _manualDarkMode = await getManualDarkMode();
    setState(() {});
  }

  // 系统亮度变化时触发的回调
  @override
  void didChangePlatformBrightness() {
    super.didChangePlatformBrightness();
    // 仅在未手动设置时更新状态
    if (_manualDarkMode == null) {
      setState(() {});
    }
  }

  @override
  Widget build(BuildContext context) {
    final isDarkMode = _getCurrentDarkMode();
    return MaterialApp(
      home: Scaffold(
        body: SafeArea(
          child: Column(
            children: [
              Switch(
                value: isDarkMode,
                onChanged: (bool value) {
                  setState(() {
                    _manualDarkMode = value;
                    saveManualDarkMode(value);
                  });
                },
              ),
              Expanded(
                child: Container(
                  color: isDarkMode ? Colors.black : Colors.white,
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

功能说明

  • 手动切换开关时,会保存当前设置为手动模式,后续系统变化不会覆盖该设置
  • 未手动设置时,页面会跟随系统深色/浅色模式自动切换
  • 手动设置后,若想恢复跟随系统,可通过开关切换回与当前系统一致的状态(此时会清除手动设置标记)

内容的提问来源于stack exchange,提问作者Jorpy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 21:08:44