Обновлять переменную виджета с состоянием после того, как она отрендерилась? - PullRequest
0 голосов
/ 23 июня 2019

Я использую TabBarView с двумя вкладками, каждая из которых отображает виджет с сохранением состояния - назовем их Основным виджетом и Виджетом конфигурации.

Виджет конфигурации служит в качестве 'раздел конфигурации 'для основного виджета - я использую его для установки таких вещей, как цвет фона и переменная URL-адреса в основном виджете, который используется для получения данных из веб-службы.

Главный виджет имеет ListView, который заполняется этим веб-сервисом.Я использую шаблон Bloc для отправки событий от одного виджета к другому, и именно так виджет конфигурации отправляет значение URL в главный виджет - событие вызывается, что любезно предоставлено блокомстановится объектом 'состояния' с новым URL-адресом, который Main Widget может прочитать в своем конструкторе и использовать для создания ListView.

Прямо сейчас я использую механизм wantKeepAlive в MainВиджет, позволяющий избежать повторного заполнения ListView, если я не изменил URL в виджете конфигурации - если я этого не сделаю, основной виджет перестраивается каждый раз, когда я возвращаюсь на его вкладку, даже если я ничего не изменил в виджете конфигурации,

Что я хочу сделать, это установить это значение выборочно, чтобы при изменении URL-адреса в конфигурации обновлять значение wantKeepAlive до false, чтобы ListView перестраивал с новым URL.Но когда сборка завершена, установите значение wantKeepAlive обратно на true, чтобы перестройка не производилась до следующего изменения URL.

Существует ли метод жизненного цикла, который я могу вызвать, когда метод build()завершено, где я могу установить параметр wantKeepAlive?Я не думаю, что делать это в самом методе сборки будет работать.Открыты для предложений, и спасибо.

1 Ответ

2 голосов
/ 23 июня 2019

Вы можете использовать addPostFrameCallback вашего WidgetsBinding экземпляра для выполнения некоторого кода после сборки вашего виджета.

  _onLayoutDone(_) {
    //add your code here
  }

  @override
  void initState() {
    WidgetsBinding.instance.addPostFrameCallback(_onLayoutDone);
    super.initState();
  }
...