Вызов notifyListeners () из ScopedModel без запуска перезагрузки FutureBuilder - PullRequest
0 голосов
/ 13 февраля 2019

Я разрабатываю приложение, которое отображает список, используя FutureBuilder.Данные для FutureBuilder извлекаются из ScopedModel/Model, который, в свою очередь, извлекает данные из HTTP API.

В Model реализован очень простой механизм кэширования, поэтому данные хранятся в List и по умолчанию действительны в течение 30 минут.Пользователь также может принудительно выполнить обновление, нажав кнопку «перезагрузить» на панели действий приложения.

Это прекрасно работает, за исключением одной крошечной детали.Всякий раз, когда Model извлекает данные с использованием HTTP, я хочу, чтобы кнопка «перезагрузить» показала это, превратившись в CircularProgressIndicator.Это достаточно просто реализовать с помощью чего-то подобного в Model:

void forceRefresh(){
    this.isLoading = true;
    notifyListeners();
    this._items = await fetchUsingHTTP(); // This fetches the data using HTTP
    this.isLoading = false;
    notifyListeners();
}

В пользовательском интерфейсе я могу просто отобразить CircularProgressIndicator или кнопку в зависимости от значения model.isLoading.

Но - вызов notifyListeners() вызывает перезагрузку FutureBuilder, что, конечно, желательно после загрузки данных, но не раньше, поскольку единственное, что изменилось, это model.isLoading,Даже если ничего не изменилось, FutureBuilder на мгновение мигает и прокручивается до вершины при первом вызове notifyListeners().

Как можно предотвратить перезагрузку FutureBuilder или ограничить первый notifyListeners() вызов, чтобы просто уведомить кнопку перезагрузки, а не остальную часть пользовательского интерфейса?

...