Как работает перерисовка виджета Flutter при изменении его свойств?

Мне просто интересно, как работает Flutter Widget при изменении свойств родительского виджета.

Допустим, у нас есть родительский виджет, который отображает базу виджетов на основе некоторого изменяемого значения или некоторого прослушиваемого значения (например, в шаблоне блока).

return Scaffold(
  body: BlocBuilder<LocationBloc, LocationState>(builder: (context, state) {
    if (state is NewLocationState) {
      return Map(
        location: LatLng(state.latitude, state.longitude),
      );
    }
    return Container();
  }),
);

Итак, в приведенном выше коде NewLocationState приходит каждые 15 секунд с новыми значениями.

У меня вопрос: что происходит с этим Map виджетом?

Отрисовывает ли Flutter совершенно новый Map виджет каждые 15 секунд с новым NewLocationState или похожим на React, Flutter может сравнивать изменения в каком-то виртуальном дереве и изменять только свойства в существующем Map, что эффективно и должно приводить к меньшему потреблению памяти.

Пример блока предназначен только для справки / контекста моего вопроса. но я хочу знать в целом, как ведет себя Flutter Widget при изменении свойств.

Ваше здоровье


person OMGImOut    schedule 12.01.2020    source источник
comment
Чтобы получить полную информацию о том, как флаттер отображает виджеты, обратитесь к этому видео: youtube.com/watch? v = 996ZgFRENM   -  person Harshvardhan Joshi    schedule 12.01.2020


Ответы (1)


Итак, в приведенном выше коде NewLocationState приходит каждые 15 секунд с новыми значениями.

Отрисовывает ли Flutter совершенно новый виджет карты каждые 15 секунд?

да. Виджеты не используются повторно.

С другой стороны, пока экземпляр виджета воссоздается, связанные с ним State & Element & RenderObjects сохраняются (поскольку вместо этого они являются изменяемыми).

Поскольку именно эти три компонента выполняют всю работу в приложении Flutter, на самом деле это довольно эффективно.

person Rémi Rousselet    schedule 12.01.2020
comment
Спасибо, поэтому лучше всего один раз создать экземпляр Map Widget без утверждения состояния и переместить BlocProvider внутри Map виджета, или это не имеет значения, так как я вызываю setState для NewLocationState внутри Widget, и Widget все равно будет повторно визуализироваться? - person OMGImOut; 12.01.2020
comment
Неважно. - person Rémi Rousselet; 12.01.2020
comment
@ RémiRousselet Ну, я сомневаюсь. Как вы сказали, виджеты не используются повторно, поэтому при обновлении происходит то, что происходит со старым виджетом. Flutter избавляется от него или он все еще будет в памяти? - person Chinky Sight; 22.02.2021