Использование StreamBuilder для создания виджета из будущего в Flutter

#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());
  },
);