Как проверить, включен ли темный режим Android Q во Флаттере?

Как я могу проверить, включен ли темный режим в Android Q с Flutter?
Я знаю, как установить темный режим, но я не нашел способа проверить фоновую тему.
Вот код для установки темной темы.

darkTheme: ThemeData.dark(),

15 ответов

Решение

Я нашел способ. Вот.

  bool _darkModeEnabled = false;

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

Вы можете проверить это используя MediaQuery,

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

С введением в Dart методов расширения я предпочитаю добавить эту функциональность в BuildContextнапрямую. Это обеспечивает более понятный интерфейс и улучшает чтение.

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

extension DarkMode on BuildContext {
  /// is dark mode currently enabled?
  bool 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');
}

Если вы определите темную тему в своем MaterialAppваше приложение автоматически погаснет, когда Android Q темная тема включена. Вы должны указать свою темную тему следующим образом:

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

Согласно этой средней статье,

Теперь, когда вы переключаете Dark Theme в системном ящике, ваше приложение Flutter автоматически переключается с вашей обычной темы на вашу DarkTheme!

Однако, если вы хотите вручную проверить, находитесь ли вы в темном режиме, вы можете легко написать метод, используя Platform Channel API. Подробнее здесь. Что касается нативного кода, проверьте здесь.

Как я могу проверить, включен ли темный режим

Отвечать:

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

Вы можете использовать ThemeMode внутри MaterialApp.

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

ThemeMode.system получит активную тему в ОС, а затем либо воспользуется theme или же darkTheme. Дополнительно ThemeMode.dark всегда будет использовать darkTheme и ThemeMode.light всегда будет использовать theme.

Независимо от текущей платформы, если у вас есть доступ к context вы можете просто проверить это, используя Theme. Ниже приведен образец, который я использовал для изменения белого цвета на прозрачный, если в настоящее время тема приложения dark.

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

Если вы используете управление состоянием Getx, не беспокойтесь, потому что Getx предоставил решение

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

Пожалуйста, обратите внимание, чтоMediaQuery.of(context).platformBrightnessприведет к перестройке всех событий медиа-запросов, включая изменение размера экрана, поворот, всплывающую клавиатуру и т. д.

Вместо,MediaQuery.platformBrightnessOfперестраивать только при изменении темного режима системы:

      final brightness = MediaQuery.platformBrightnessOf(context);
final systemDarkMode = brightness == Brightness.dark;

Попробуйте следующий код

      Brightness brightness = Theme.of(context).brightness
bool isDarkMode = brightness == Brightness.dark;
bool isLightMode = brightness == Brightness.light;

Проверьте режим темы ОС: (при использовании ThemeMode.system)

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

Если вы хотите проверить режим внутренней темы приложения

установить яркость в MaterialApp

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

а затем получить тему

      var brightness = MediaQuery.of(context).platformBrightness;

или же

      var brightness = Theme.of(context).brightness

Для меня разветвлена, по крайней мере, версия с плагином AdaptiveTheme.

      Theme.of(context) == darkThemeData

AdaptiveTheme.of(context).theme == darkThemeData
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;
}

Я использую 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;
}

Это будет работать, даже если вы измените режим темы приложения вручную в своем приложении.Theme.of(context).brightness == Brightness.dark

Другие вопросы по тегам