如何使用 Flutter 在 iOS/Android 上检查是否启用了暗模式?

我怎样才能检查是否暗模式启用 仿生人 Q颤抖?我知道如何设置黑暗模式,但是我没有找到检查背景主题的方法。
下面是设置黑暗主题的代码。

darkTheme: ThemeData.dark(),
43996 次浏览

有两种方式:

  1. 不需要 context 。可以在 initState中使用,例如:

     var brightness = SchedulerBinding.instance.window.platformBrightness;
    bool isDarkMode = brightness == Brightness.dark;
    

    或(如 摩尔的律师所建议)

     var brightness = SchedulerBinding.instance.platformDispatcher.platformBrightness;
    bool isDarkMode = brightness == Brightness.dark;
    
  2. context必须 :

     var brightness = MediaQuery.of(context).platformBrightness;
    bool isDarkMode = brightness == Brightness.dark;
    

如果你在 MaterialApp中定义了一个黑暗主题,当启用 Android Q 黑暗主题时,你的应用程序将自动变黑。你必须像这样指定你的黑暗主题:

MaterialApp(
theme: ThemeData(
brightness: Brightness.light,
primaryColor: Colors.red,
),
darkTheme: ThemeData(
brightness: Brightness.dark,
),
);

根据 这篇中文文章,

现在,当你在系统抽屉中切换黑暗主题时,你的 Flutter 应用程序将自动从常规主题切换到黑暗主题!

但是,如果您想手动检查是否处于黑暗模式,则可以使用 Platform Channel API 轻松编写方法。更多细节 给你。至于本机代码,看这里

我找到路了,就是这里。

  bool _darkModeEnabled = false;


void _checkIfDarkModeEnabled() {
final ThemeData theme = Theme.of(context);
theme.brightness == appDarkTheme().brightness
? _darkModeEnabled = true
: _darkModeEnabled = false;
}

可以在 MaterialApp中使用 ThemeMode

MaterialApp(
themeMode: ThemeMode.system,
theme: ThemeData(
brightness: Brightness.light,
primaryColor: Colors.red,
),
darkTheme: ThemeData(
brightness: Brightness.dark,
),
);

ThemeMode.system将在操作系统中获得活动主题,然后使用 themedarkTheme。此外,ThemeMode.dark将始终使用 darkThemeThemeMode.light将始终使用 theme

bool _darkModeEnabled = false;
bool _lightModeEnabled = false;


void _checkIfDarkModeEnabled() {
final ThemeData theme = Theme.of(context);
theme.brightness == Brightness.dark
? _darkModeEnabled = true
: _darkModeEnabled = false;
}
void _checkIfLightModeEnabled() {
final ThemeData theme = Theme.of(context);
theme.brightness == Brightness.light
? _lightModeEnabled = true
: _lightModeEnabled = false;
}

不管当前的平台是什么,如果您有访问 context的权限,只需使用 Theme进行检查。如果当前应用程序主题是 dark,下面是我用来将白色改为透明色的例子。

(Theme.of(context) == Brightness.dark) ? Colors.white : Colors.transparent

选中 OS 主题模式: (如果使用 ThemeMode.system)

Brightness brightness =  MediaQueryData.fromWindow(WidgetsBinding.instance.window).platformBrightness;
bool darkModeOn = brightness == Brightness.dark;

或使用主题

Brightness brightness = Theme.of(context).brightness
bool darkModeOn = brightness == Brightness.dark;

MaterialApp中设置亮度

theme: ThemeData(
brightness: Brightness.light,
),
darkTheme: ThemeData(
brightness: Brightness.dark,
),

随着 扩展方法在 Dart 中的引入,我更喜欢直接将这个功能附加到 BuildContext中。这提供了一个更干净的感觉界面和阅读更好。

import 'dart:ui';
import 'package:flutter/widgets.dart';


extension DarkMode on BuildContext {
/// is dark mode currently enabled?
bool get isDarkMode {
final brightness = MediaQuery.of(this).platformBrightness;
return brightness == Brightness.dark;
}
}

然后在构建函数中我可以很容易地使用它。

@override
Widget build(BuildContext context) {
final Widget logo = SvgPicture.asset(
context.isDarkMode ? "assets/logo_dark.svg" : "assets/logo.svg",
semanticsLabel: 'my logo');
}


我使用的是 https://github.com/arthurdenner/theme_mode_handler,正确的方法是首先检查它是否设置在系统上,否则我们检查主题处理程序:

bool is_dark(BuildContext context){
if(ThemeModeHandler.of(context)!.themeMode == ThemeMode.system)
return (Theme.of(context).brightness == Brightness.dark);
else
return ThemeModeHandler.of(context)!.themeMode == ThemeMode.dark;
}

如果您正在使用 Getx 状态管理,那么不用担心,因为 Getx 提供了解决方案

bool ThemeModes(){
Get.isDarkMode? return true: return false;}

如何检查是否启用暗模式

回答:

Theme.of(context).brightness == Brightness.dark

对我来说是分叉的,至少是带 AdaptiveTheme 插件的版本。

Theme.of(context) == darkThemeData


AdaptiveTheme.of(context).theme == darkThemeData

这将工作,甚至你改变应用程序的主题模式手动在您的应用程序。 (上下文)的主题