当前位置: 首页 > news >正文

Flutter系统亮度检测完全指南:MediaQuery.platformBrightnessOf() 的妙用

基本概念

MediaQuery.platformBrightnessOf(context) 用于获取当前操作系统的亮度模式,而不是应用的主题模式。

返回值

· Brightness.light:系统当前是亮色模式
· Brightness.dark:系统当前是暗色模式

基本用法

// 获取系统亮度
Brightness systemBrightness = MediaQuery.platformBrightnessOf(context);// 判断是否是暗色模式
bool isSystemDark = systemBrightness == Brightness.dark;print('系统亮度模式: $systemBrightness'); // Brightness.light 或 Brightness.dark

与主题提供的区别

方法 来源 用途
MediaQuery.platformBrightnessOf(context) 操作系统设置 获取系统当前的亮度模式
Theme.of(context).brightness 应用主题 获取应用当前的主题亮度
Provider.of(context).isDarkMode 用户选择 获取用户选择的主题状态

实际应用场景

  1. 根据系统亮度设置UI

Widget build(BuildContext context) {Brightness systemBrightness = MediaQuery.platformBrightnessOf(context);bool isSystemDark = systemBrightness == Brightness.dark;return Container(color: isSystemDark ? Colors.black : Colors.white,child: Text('当前系统是${isSystemDark ? "暗色" : "亮色"}模式',style: TextStyle(color: isSystemDark ? Colors.white : Colors.black,),),);
}
  1. 系统导航栏适配
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(systemNavigationBarColor: MediaQuery.platformBrightnessOf(context) == Brightness.dark ? Colors.black : Colors.white,systemNavigationBarIconBrightness: MediaQuery.platformBrightnessOf(context) == Brightness.dark ? Brightness.light : Brightness.dark,),
);
  1. 跟随系统主题的组件
Widget build(BuildContext context) {final systemBrightness = MediaQuery.platformBrightnessOf(context);return Icon(Icons.brightness_auto,color: systemBrightness == Brightness.dark ? Colors.white : Colors.black,);
}

结合用户主题选择的完整方案

Widget build(BuildContext context) {final themeProvider = Provider.of<ThemeProvider>(context);final systemBrightness = MediaQuery.platformBrightnessOf(context);// 确定最终主题:如果用户选择"跟随系统",就用系统亮度final bool actualIsDarkMode;if (themeProvider.themeMode == ThemeMode.system) {actualIsDarkMode = systemBrightness == Brightness.dark;} else {actualIsDarkMode = themeProvider.themeMode == ThemeMode.dark;}// 应用主题设置SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(systemNavigationBarColor: actualIsDarkMode ? Colors.black : Colors.white,systemNavigationBarIconBrightness: actualIsDarkMode ? Brightness.light : Brightness.dark,),);return Scaffold(backgroundColor: actualIsDarkMode ? Colors.black : Colors.white,// ... 其他代码);
}

注意事项

  1. 实时性:系统亮度改变时会自动重建widget
  2. 平台支持:在所有平台都有效
  3. 性能:调用成本很低,可以放心在build方法中使用
  4. 与Theme的区别:不要和Theme.of(context).brightness混淆

常见错误用法

// ❌ 错误:混用系统亮度和主题亮度
SystemUiOverlayStyle(systemNavigationBarColor: MediaQuery.platformBrightnessOf(context) == Brightness.dark ? Colors.black : Colors.white,systemNavigationBarIconBrightness: Theme.of(context).brightness == Brightness.dark  // 混用了!? Brightness.light : Brightness.dark,
)

最佳实践

// 在需要根据系统设置(而不是应用主题)调整UI时使用
final systemBrightness = MediaQuery.platformBrightnessOf(context);// 在需要根据用户最终选择的主题调整UI时,使用统一的判断逻辑
final actualTheme = themeProvider.themeMode == ThemeMode.system? MediaQuery.platformBrightnessOf(context): (themeProvider.themeMode == ThemeMode.dark ? Brightness.dark : Brightness.light);

总结:MediaQuery.platformBrightnessOf(context) 主要用于获取系统级别的亮度设置,适合需要跟随系统外观的场景。


文章转载自:

http://nylYug75.crtgd.cn
http://cXJw5RsP.crtgd.cn
http://CRyt17HW.crtgd.cn
http://GJg85G6W.crtgd.cn
http://sI72V33f.crtgd.cn
http://VTaCItg5.crtgd.cn
http://p1pJOXbM.crtgd.cn
http://YvyFAqe9.crtgd.cn
http://0x14nxe8.crtgd.cn
http://20HrI0Q9.crtgd.cn
http://9YROhoJk.crtgd.cn
http://HmAZQUK9.crtgd.cn
http://Q3HnGpXN.crtgd.cn
http://rSFMhhmo.crtgd.cn
http://r4gAQVIb.crtgd.cn
http://xiP8M6vt.crtgd.cn
http://NZls7EsW.crtgd.cn
http://5n2i6Vyv.crtgd.cn
http://pOfgPnGs.crtgd.cn
http://tC1Uyhi1.crtgd.cn
http://KYFkXNGS.crtgd.cn
http://1WE3cItH.crtgd.cn
http://c8Xk5UAf.crtgd.cn
http://EcS8zgWC.crtgd.cn
http://wzlj2LMg.crtgd.cn
http://TjUknZE5.crtgd.cn
http://UK283vc3.crtgd.cn
http://ntZtWo8W.crtgd.cn
http://VtiLMURi.crtgd.cn
http://oTUq1e2p.crtgd.cn
http://www.dtcms.com/a/384433.html

相关文章:

  • flutter鸿蒙:适配app_links插件
  • 计算机视觉(opencv)实战二十二——指纹图像中提取特征点,计算两两指纹之间的相似度
  • 如何启动档案开启对话框及浏览资料夹对话框
  • 抗菌涂层与智能诊疗:伟荣医疗重构口腔器械感控与精准治疗新范式
  • python3
  • 茉莉 X4-QZ 840M矿机参数分析:Etchash算法挖矿的高效能选择
  • iOS App 混淆与加固对比 源码混淆与ipa文件混淆的区别、iOS代码保护与应用安全场景最佳实践
  • 鸿蒙Next ArkWeb网页多媒体开发实战:从基础到高级应用
  • ActiveMQ RocketMQ RabbitMQ Kafka选型及应用场景
  • 汽车网络安全 CyberSecurity ISO/SAE 21434 测试之二
  • pyAutoGUI 模块主要功能介绍-(3)截图与图像识别功能
  • 泛型(Generics)what why when【前端TS】
  • 优化神经网络模型以提升R²值至0.99的全面方案
  • AR眼镜:远程协作的“破局者”,让问题解决“云手帮”
  • 本地部署 GPS 跟踪系统 Traccar 并实现外部访问
  • 【Pycharm】“无法载入新的虚拟环境,加载框一闪而过,只能加载conda虚拟base环境”的问题解决方法
  • JVM-运行时内存-虚拟机栈与本地方法栈
  • Matplotlib定制:精解颜色、字体、线型与标记
  • 让AI帮助我们将Python程序打包EXE可执行文件的完整指南
  • vs2019远程调试——设置远程机器上的include目录和so目录
  • 如何使用 Spring Boot、Kafka 和 Kubernetes 构建可扩展的消息处理应用
  • 贪心算法应用:手术室排程问题详解
  • ZooKeeper深度性能优化指南:从原理到实战的全面调优
  • 2025软件测试高频面试题
  • 【论文阅读】Diff-Privacy: Diffusion-based Face Privacy Protection
  • 第四篇:【基础篇】Python的“单词”与“语法”:深入理解变量、关键字与标识符
  • Python的输出缓冲区机制
  • Scikit-learn 简单介绍入门和常用API汇总
  • [Dify] 用多个工具节点构建多轮 API 调用任务流:链式任务设计实战指南
  • Java实战:从零开发图书管理系统