#android #flutter #dart #provider
#Android #флаттер #dart #поставщик
Вопрос:
Я использую Theme.of(context)
для стилизации оформления ящика в виджете ящика моего приложения. Но это приводит к тому, что мой виджет ящика и его родительский элемент перестраиваются еще несколько раз, когда я переключаю переключатель тем (который показывает эффект затухания / затухания при переключении на светлую / темную тему) Provider.of
при нажатии кнопки.
Почему это так? Разве недостаточно перестроить виджет один раз или максимум два раза? Этого не происходит, когда я использую статический цвет, подобный Colors.green
. Мне нужно избегать этих перестроек, потому что это может повлиять на приложение в будущем по мере роста кода. На самом деле, это влияет на данный момент.
Мое дерево приложений выглядит так:
— MyApp (StatelessWidget)
— Поставщик
—- Потребитель
——- MaterialApp
——— Рабочий стол
———— Эшафот
————- Выдвижной ящик <- который использует Theme.of(context)
и создается еще несколько раз без необходимости, когда я переключаю тему, и заставляет рабочий стол также перестраиваться
Комментарии:
1. давайте посмотрим несколько кодов… если вы установите state в функции сборки, это может произойти… давайте посмотрим, как вы переключаете тему
2. Все они являются виджетами без состояния. Я использую провайдера, как я уже сказал. Как только нажата кнопка в ящике, я обновляю тему благодаря поставщику потребителю.
3. итак, вы меняете тему один раз, и все же это вызывает несколько перестроек?
4. Точно. Это происходит только тогда, когда я использую
Theme.of
для указания цвета BoxDecoration заголовка DrawerHeader в ящике. Если я использую статический цветColors.green
, он создается только один раз. В противном случае несколько раз (3-4 раза). Интересно, в чем причина, если это нормально и я должен игнорировать..5. я только что провел быстрый тест, и кажется, что перестройка выполняется только один раз
Ответ №1:
В репозитории Flutter на Github была обнаружена проблема.
Сотрудники Google подтвердили проблему, но на данный момент не проводят расследование.
Лично я избегаю статического унаследованного метода виджета Theme.of(conext)
, пока это не будет исправлено.
Вместо этого я использую решение для управления состоянием для хранения ThemeData, делая его доступным во всем приложении. Я ссылаюсь на это, когда нужны элементы темы.