#flutter #dart #mobile
Вопрос:
Я пытаюсь создать виджет со списком значений, возвращаемых вызовом api, с помощью StreamBuilder. Поток создается из будущего с использованием метода fromFuture. Я вижу, как выполняется вызов api и значение помещается в будущую переменную, но создание потока никогда не запускает StreamBuilder.
Очевидно, мне чего-то не хватает в моем понимании потоков и того, как они работают в Dart. Если бы кто-нибудь мог прояснить это, я был бы очень признателен.
Виджет без состояния:
return StreamBuilder<List<Category>>(
stream: api.getCategories(),
builder: (context, snapshot) {
if ( snapshot.hasData ) {
final children = snapshot.data!.map((category) => Text(category.name)).toList();
return ListView(children: children);
}
return Center(child: CircularProgressIndicator());
},
);
Класс API:
Stream<List<Category>> getCategories() {
return Stream.fromFuture(this.apiCategories());
}
Future<List<Category>> apiCategories() async {
// api call made here
}
Ответ №1:
Предполагая, что вы использовали await
в своем будущем и все такое, вы могли бы сначала проверить, выполнено ли ваше соединение или ожидает.
return StreamBuilder<List<Category>>(
stream: api.getCategories(),
builder: (context, snapshot) {
if(snapshot.connectionState == ConnectionState.done){
if ( snapshot.hasData ) {
final children = snapshot.data!.map((category) => Text(category.name)).toList();
return ListView(children: children);
}
else{
return Center(child: Text("No data returned from the API"));
}
}
return Center(child: CircularProgressIndicator());
},
);