Flutter: программно вызывает использование darkTheme

Во Flutter вы можете установить темную тему для использования, которая будет использоваться в определенных контекстах (например, темный режим установлен на Android Q). Есть ли рекомендуемый способ разрешить это программно переопределить; например, в ответ на предпочтения пользователя?

Думаю, это можно сделать на самом верхнем уровне приложения:

MaterialApp(
    theme: ThemeData.light(),
    darkTheme: ThemeData.dark(),
    themeMode: fromSomeState,
)

Однако я также хотел бы иметь возможность программно включать, находится ли приложение в темном режиме в различных точках приложения (например, для выбора изображения):

MediaQuery.of(context).platformBrightness == Brightness.dark;

Я мог бы попробовать обновить MediaQueryData переопределить platformBrightness тоже, но это можно сделать только внутри MaterialApp, что кажется неудобным.

Есть ли лучший образец для подобных вещей?

1 ответ

Вы можете проверить dynamic_theme

Как пользоваться

Просто добавь Dynamic Theme как родитель вашего MaterialApp

DynamicTheme(
  defaultBrightness: Brightness.light,
  data: (brightness) => new ThemeData(
    primarySwatch: Colors.indigo,
    brightness: brightness,
  ),
  themedWidgetBuilder: (context, theme) {
    return new MaterialApp(
        .......
    );
  }
)

Получить currentBrightness с помощью

    DynamicTheme.of(context).brightness;

И установите его, используя

    DynamicTheme.of(context).setBrightness(Theme.of(context).brightness == Brightness.dark? Brightness.light: Brightness.dark);

Вы можете прочитать об этом больше или создать свой собственный, проверьте этот средний пост

Отредактировано

Вы можете проверить текущую тему ОС, используя

MediaQuery.of(context).platformBrightness;

И установите тему соответственно.

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