Flutter Firebase ListView - медленное обновление - PullRequest
1 голос
/ 24 февраля 2020

Я создал ListView, который заполняется из коллекции Firebase с помощью виджета StreamBuilder. Заполнение ListView занимает некоторое время, потому что я запускаю задачи (HTTP-запросы) для каждого элемента коллекции Firebase, а затем отображаю результат в списке.

Когда я ухожу со страницы с ListView и затем вернуться на страницу (используя PageView), ListView, по-видимому, полностью обновляет sh вместо использования последней увиденной версии. Таким образом, индикатор хода выполнения составляет ~ 5 секунд, а список обновляется каждый раз при повторном открытии страницы.

Вопросы:

  • Каков наилучший способ сделать это ListView не завершает полные 5 секунд refre sh каждый раз, когда страница открывается заново? Может ли он использовать последнюю увиденную версию и обновляться только тогда, когда элементы добавляются в коллекцию Firebase?
  • Если бы я должен был удалить задачи (HTTP-запросы), которые необходимо выполнить для каждого элемента коллекции, а вместо этого просто показывать значения непосредственно из коллекции Firebase, должно ли время refre sh быть достаточно быстрым, чтобы это не было проблемой?
  • Лучше ли создавать локальную базу данных (используя sqflite), которая синхронизируется с коллекцией Firebase для предотвратить медленное обновление?

Код:

class AccountsPage extends StatefulWidget {
  @override
  _AccountsPageState createState() => _AccountsPageState();
}

class _AccountsPageState extends State<AccountsPage> {
  User user;

  Widget _buildListItem(BuildContext context, DocumentSnapshot document, String uuid) {

    // get data from firebase
    String token = document.data.values.toList()[0];

    // For current document/token, make an HTTP request using the token and return relevant data
    return Column(
      mainAxisSize: MainAxisSize.min,
      children: <Widget>[
        Flexible(
          child: FutureBuilder(
          future: anHTTPrequest(token, uuid),
          builder: (context, projectSnap) {
            if (projectSnap.connectionState == ConnectionState.none ||
                !projectSnap.hasData || projectSnap.data.length == 0) {
              return Container();
            }
            return ListView.builder(
              shrinkWrap: true,
              itemCount: projectSnap.data.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text(projectSnap.data[index]),
                );
              },
            );
          },
        ),
      )],
    );
  }

  @override
  Widget build(BuildContext context) {
    final container = StateContainer.of(context);
    user = container.user;
    return Container(
      child: Scaffold(
        body: Column(
          children: <Widget>[
            new Flexible(
              child: StreamBuilder(
                stream: Provider.of(context).collectionRef.document(user.uuid).collection('tokens').snapshots(),
                builder: (context, snapshot){
                  if (!snapshot.hasData){
                    return Container(
                      child: Center(
                        child: Text("No data")
                      )
                    );
                  }

                  return ListView.builder(
                    padding: EdgeInsets.all(8.0),
                    reverse: false,
                    itemCount: snapshot.data.documents.length,
                    itemBuilder: (context, int index) {
                      return _buildListItem(context, snapshot.data.documents[index], user.uuid);
                    }
                  );        
                }
              )

            ),
          ]
        ),
      ),
    );
  }
}
...