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

Flutter:系统主题切换时触发函数执行的实现方法

监听系统主题切换并触发函数的实现方法

不同平台/环境下有对应的实现方式,以下是常见场景的解决方案:

1. 前端网页(浏览器环境)

利用浏览器的媒体查询API监听系统主题偏好变化,代码示例:

// 创建对应深色主题的媒体查询对象
const darkModeQuery = window.matchMedia('(prefers-color-scheme: dark)');

// 定义主题切换时要执行的函数
function handleThemeChange(e) {
  if (e.matches) {
    console.log('切换到深色主题');
    yourCustomFunction(); // 替换成你自己的函数
  } else {
    console.log('切换到浅色主题');
    yourCustomFunction();
  }
}

// 页面加载时先执行一次,适配当前主题
handleThemeChange(darkModeQuery);

// 绑定主题变化监听事件
darkModeQuery.addEventListener('change', handleThemeChange);

浏览器会根据系统主题设置触发媒体查询的change事件,你可以在回调里执行自定义逻辑。

2. Windows桌面应用(以C#为例)

通过监听系统用户偏好变化事件,结合注册表项判断当前主题模式:

using Microsoft.Win32;

// 初始化时注册监听事件
SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged;

private void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e)
{
    // 仅处理主题相关的偏好变化
    if (e.Category == UserPreferenceCategory.General)
    {
        // 读取注册表判断是否为深色模式
        bool isDarkMode = Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize", "AppsUseLightTheme", 1) is 0;
        
        if (isDarkMode)
        {
            // 深色主题触发逻辑
            YourCustomFunction();
        }
        else
        {
            // 浅色主题触发逻辑
            YourCustomFunction();
        }
    }
}

// 应用退出时记得取消事件绑定,避免内存泄漏
SystemEvents.UserPreferenceChanged -= SystemEvents_UserPreferenceChanged;

3. macOS应用(以Swift为例)

macOS提供了专门的通知来监听深色模式切换,代码示例:

import AppKit

// 在合适的生命周期阶段注册通知监听
NotificationCenter.default.addObserver(
    self,
    selector: #selector(handleThemeChange),
    name: NSWorkspace.darkModeDidChangeNotification,
    object: nil
)

@objc func handleThemeChange() {
    // 判断当前是否为深色主题
    let isDarkMode = NSApp.effectiveAppearance.bestMatch(from: [.darkAqua, .aqua]) == .darkAqua
    
    if isDarkMode {
        yourCustomFunction()
    } else {
        yourCustomFunction()
    }
}

// 销毁对象时移除监听
deinit {
    NotificationCenter.default.removeObserver(self, name: NSWorkspace.darkModeDidChangeNotification, object: nil)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:35:20