Использование «Theme.of» вызывает повторную сборку виджета

#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, делая его доступным во всем приложении. Я ссылаюсь на это, когда нужны элементы темы.