Как проверить, включен ли темный режим 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