Изменение темы приложения iOS автоматически между светлым и темным в зависимости от темы окружающей среды iOS - PullRequest
0 голосов
/ 27 января 2020

Ладно, поэтому я уже провел немало исследований по этой конкретной теме c ранее, и я знаю, что это функция, которую разработчики Flutter еще не реализовали для автоматического функционирования (настройка освещения и темные темы для динамического изменения при открытии приложения), но я знаю, что это возможно. Я не хочу, чтобы моим пользователям приходилось делать этот выбор, и я знаю, что я близок, но я упускаю что-то важное. Я объясню:

final Brightness brightnessValue = MediaQuery.of(context).platformBrightness;
bool isDark = brightnessValue == Brightness.dark;

Эти две строки кода ДОЛЖНЫ пройти через логический (темная тема true или false) в мой код. Эти строки кода выполняются, но выдают ошибку.

MediaQuery.of () вызывается с контекстом, который не содержит MediaQuery. Не может быть найдено предка MediaQuery, начиная с контекста, который был передан MediaQuery.of (). Это может произойти из-за того, что у вас нет виджета WidgetsApp или MaterialApp (эти виджеты содержат MediaQuery), или это может произойти, если используемый вами контекст происходит из виджета над этими виджетами.). Используемый контекст: MyApp, см. Также: https://flutter.dev/docs/testing/errors

Теперь я видел, как некоторые люди реализуют эту строку кода, и она работает для них, поэтому я знаю, что это не синтаксическая вещь , И я фактически помещаю эту строку кода под приложением виджетов, как они просят (насколько я понимаю, поэтому я в тупике.

Соответствующий код:

CupertinoThemeData currentTheme;
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {

    final Brightness brightnessValue = MediaQuery.of(context).platformBrightness;
    bool isDark = brightnessValue == Brightness.dark;
    <CODE TO SELECT THEME DEPENDING ON PHONE'S THEME.  Setting parameters of currentTheme>

    return CupertinoApp(
      <CODE FOR APP>
    ),
  }
}

Теперь я поместил бы его в виджет CupertinoApp, но это тоже не сработало, так как вы не можете сделать там вызов функции внутри, и мне НУЖНО передать туда тему, так как это влияет на всю программу. Тематика.

По сути, это выглядит как сценарий «курица и яйцо», где я не могу задать тему, пока не получу медиа-запрос, и не могу выполнить медиа-запрос, пока Мы уже установили тему, которая сводит на нет всю цель запроса.

Есть идеи?

1 Ответ

0 голосов
/ 28 января 2020

После того, как несколько часов ударился головой о кирпичную стену, наконец-то понял (для всех, у кого похожая проблема).

Хитрость в том, что да, вам действительно нужно разместить код, который выбирает тему внутри строки

return CupertinoApp( <Here> )

Вы можете сделать это через:

builder: (BuildContext context, Widget child) {

   final Brightness brightnessValue = MediaQuery.of(context).platformBrightness;
   bool isDark = brightnessValue == Brightness.dark; 

   // All your code to set your two themes, light and dark can go here.

}

Таким образом, вместо сценария «курица и яйцо», который я представлял, вы устанавливаете тему укажите в тот момент, когда вам это нужно.

Надеюсь, это кому-нибудь поможет.

...