Я создал 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);
}
);
}
)
),
]
),
),
);
}
}