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
相关产品推荐
相关产品推荐

