如何检查Flutter中是否启用了Android Q暗模式?

R2T*_*2T8 4 android dart flutter android-10.0 android-darkmode

如何检查使用Flutter的Android Q中是否启用了暗模式?我知道如何设置黑暗模式,但是我没有找到检查背景主题的方法。 这是设置黑暗主题的代码。

darkTheme: ThemeData.dark(),
Run Code Online (Sandbox Code Playgroud)

Baj*_*Bob 42

随着 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在我的构建函数中我可以轻松地使用它。

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

Run Code Online (Sandbox Code Playgroud)


Ber*_*eam 13

如何检查是否启用了深色模式

回答:

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


小智 10

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

MaterialApp(
  theme: ThemeData(
    brightness: Brightness.light,
    primaryColor: Colors.red,
  ),
  darkTheme: ThemeData(
    brightness: Brightness.dark,
  ),
);
Run Code Online (Sandbox Code Playgroud)

根据这篇中篇文章

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

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


Ari*_*nha 9

可以ThemeMode在里面使用MaterialApp

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

ThemeMode.system将获取操作系统中的活动主题,然后使用themedarkTheme. 另外ThemeMode.dark将始终使用darkTheme并将ThemeMode.light始终使用theme.

  • 对不起!这并不能回答问题。 (2认同)

R2T*_*2T8 7

我找到了方法。这里是。

  bool _darkModeEnabled = false;

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

  • 您的代码检查您的应用程序正在使用的主题的亮度。这不是问题所在 - 问题是关于操作系统驱动的明/暗模式。`MaterialApp` 有 3 个相关属性:`theme`、`darkTheme` 和 `themeMode`。如果 `themeMode` 不是 `system` 或 `darkTheme` 为 null,则即使操作系统 (Android 10+/iOS 13+) 启用了深色模式,应用程序主题的亮度也将为 `light`。@CopsOnRoad 有正确答案。 (10认同)
  • 有两种不同的东西,一种是您自己设置主题,例如亮或暗,您可以使用“主题”对象进行检查,一种是您在手机设置中获取应用的主题(仅适用于 Android Pie 暗模式),为此,您使用`MediaQuery`。 (2认同)

Cop*_*oad 6

您可以使用检查它MediaQuery

var brightness = MediaQuery.of(context).platformBrightness;
if (brightness == Brightness.dark)
  print("Dark mode");
else
  print("Normal mode");
Run Code Online (Sandbox Code Playgroud)

  • 最好使用 WidgetsBinding.instance.platformDispatcher.platformBrightness。否则,某些平台可能会返回 Brightness.light,因为 instance.window 不适用。 (4认同)
  • 感谢您的回复,但此解决方案不起作用并且会使应用程序崩溃。 (3认同)

Bla*_*nka 5

无论当前的平台是什么,如果您有权访问,则context可以使用 简单地检查它Theme。以下是我用来将白色更改为透明颜色(如果当前应用程序主题为 )的示例dark

(Theme.of(context) == Brightness.dark) ? Colors.white : Colors.transparent
Run Code Online (Sandbox Code Playgroud)

  • 它对我有用 Theme.of(context).brightness == Brightness.dark .. 但这个答案是我能用最少的代码找到的最好的答案 (2认同)