флаттер бл c доходность за единицу из собственного потока - PullRequest
0 голосов
/ 07 апреля 2020

надеюсь, что у вас все хорошо, #stayhome и сохраняйте #socialdistancing:)

У меня небольшая проблема с библиотекой flutter_blo c, и я надеюсь, что кто-то может мне помочь.

У меня есть API-вызов (moviesStream), который возвращает поток. Я хотел бы иметь следующее: на каждом yield из этого потока делать yield в моем bloc и, следовательно, перестраивать мой виджет для каждого элемента, а не в конце для всех items. Я хочу построить items последовательно один за другим

Это мой подход, и я не понимаю, почему он не работает. Я очень открыт для любого другого подхода к достижению моей цели

То, что я узнал до сих пор: я не могу дать одно и то же состояние, но мое старое и новое отличаются, поэтому это не должно быть проблемой (я считать). Нужно ли отправлять / добавлять новое событие (или снова то же самое) после сдачи? Я понимаю, что, возможно, это решило бы мою проблему, но это запустило бы мой поток снова с самого начала, не так ли?

Stream<FilmeState> mapEventToState(FilmeEvent event) async* {
    final currentState = state;

    yield FilmeStateUninitialized();

    if (event is FilmeEventLoad)
    {
      yield FilmeStateLoadedV2(items: []);

      var moviesStream = Stream.fromIterable([{"1":"1"}, {"2":"2"}, {"3":"3"}]);
      await for (var value in moviesStream) {

        var newItems = List<Map<String, dynamic>>.from((state as FilmeStateLoadedV2).items);
        newItems.add(value);
        print("newItems.length=${newItems.length}");
        yield FilmeStateLoadedV2(items: newItems);
      }
}

Вывод следующий

I/flutter (12087): state=Instance of 'FilmeStateUninitialized' // this comes from my widget (BlocBuilder)
I/flutter (12087): newItems.length=1
I/flutter (12087): newItems.length=2
I/flutter (12087): newItems.length=3
I/flutter (12087): state=Instance of 'FilmeStateLoadedV2' // this comes from my widget (BlocBuilder)

I ожидал или, вернее, у меня sh будет следующий вывод

I/flutter (12087): state=Instance of 'FilmeStateUninitialized' // this comes from my widget (BlocBuilder)
I/flutter (12087): newItems.length=1
I/flutter (12087): state=Instance of 'FilmeStateLoadedV2' // this comes from my widget (BlocBuilder)
I/flutter (12087): newItems.length=2
I/flutter (12087): state=Instance of 'FilmeStateLoadedV2' // this comes from my widget (BlocBuilder)
I/flutter (12087): newItems.length=3
I/flutter (12087): state=Instance of 'FilmeStateLoadedV2' // this comes from my widget (BlocBuilder)

1 Ответ

0 голосов
/ 07 апреля 2020

Я думаю, что это происходит, потому что вы используете поток, который уже заполнен данными, поэтому не тратит время на передачу данных, и из-за этого вы получаете только последнее значение.

Если вы хотите проверьте, а затем добавьте следующую строку перед выходом из состояния.

 await Future.delayed(Duration(seconds: 1));
...