Я бы порекомендовал либо FutureBuilder , либо StreamBuilder (для потоков), который дает вам преимущества производительности макета, а также инструменты для простого добавления виджетов загрузки и ошибок.
Это может выглядеть следующим образом:
Future<List<User>> usersFuture = getUsers('DcofOiHWcjbjD0i18miW');
Создайте будущее как переменную-член, чтобы вы выбирали его только один раз (в случае, если метод инициирует новое будущее каждый раз, когда вы вызываете его). А затем используйте его внутри FutureBuilder.
FutureBuilder<List<User>>(
future: usersFuture,
builder: (context, snapshot) {
if(snapshot.connectionState != ConnectionState.done) {
// return: show loading widget
}
if(snapshot.hasError) {
// return: show error widget
}
List<User> users = snapshot.data ?? [];
return ListView.builder(
itemCount: users.length,
itemBuilder: (context, index) {
User user = users[index];
return new ListTile(
leading: CircleAvatar(
backgroundImage: AssetImage(user.profilePicture),
),
trailing: user.icon,
title: new Text(user.name),
onTap: () {
Navigator.push(context,
new MaterialPageRoute(builder: (context) => new Home()));
},
);
});
});