ListView: получение сведений с помощью FutureBuilder приводит к сбоям в работе

У меня есть ListView, и я использую ListView.builder для ленивого заполнения списка, когда дети становятся видимыми.

Однако элементы также должны отображать дополнительный контент, который я хочу получить лениво.

Для этого я создаю http-get-future в child-builder и передаю его FutureBuilder, который отображает дополнительный контент, как только Future завершается.

Однако, даже если я кэширую http-get-futures, весь список выглядит некорректно, поскольку элементы перестраиваются, когда они снова становятся видимыми, и FutureBuilder всегда отображает один ожидающий кадр без каких-либо данных («потому что нет возможности синхронно проверить если будущее уже завершено », - как пишут в документации Flutter).

Что мне изменить?


person user3612643    schedule 23.05.2019    source источник
comment
используйте MapCache - он внутренне хранит карту невыполненных вызовов, используемую для предотвращения одновременных загрузок одного и того же ключа.   -  person pskink    schedule 24.05.2019
comment
Проблема заключается в начальном кадре, в котором FuturBuilder не имеет данных. Не думайте, что здесь поможет MapCache, потому что я уже кэширую Futures.   -  person user3612643    schedule 24.05.2019
comment
ну, если у вас нет исходных данных, покажите какой-нибудь CircularProgressIndicator или что-то в этом роде   -  person pskink    schedule 24.05.2019
comment
Ошибка возникает, когда элемент списка отображается во второй раз. У меня уже есть данные, завернутые в Future в моем кеше, но FutureBuilder все еще рисует один кадр без данных. Это приводит к короткому мерцанию.   -  person user3612643    schedule 24.05.2019
comment
у вас есть несколько одновременных Futures (каждый для загрузки одного или нескольких элементов), верно? так что Future передается FutureBuilder?   -  person pskink    schedule 24.05.2019
comment
У каждого элемента в ListView есть ОДНО будущее для загрузки сведений об этом элементе. Таким образом, каждый элемент в ListView завернут в FutureBuilder с получением соответствующего Future из кеша. Однако FutureBuilder ВСЕГДА строит один кадр без каких-либо данных, даже если Future уже завершился ранее.   -  person user3612643    schedule 24.05.2019
comment
так что используйте один StatefulWidget вместо нескольких FutureBuilder, где у вас будет больше контроля над своими Future   -  person pskink    schedule 24.05.2019


Ответы (1)


Я нашел решение:

Вместо того, чтобы напрямую использовать Future в FutureBuilder, я помещаю ValueNotifier в кеш, который устанавливается внутри функции Future's then, и заменяю FutureBuilder на ListenableBuilder.

ListenableBuilder не имеет проблемы с пустым фреймом ...

person user3612643    schedule 24.05.2019