【问题标题】:flutter bloc yield per item from own stream来自自己的流的每个项目的颤动块产量
【发布时间】:2020-07-19 02:15:42
【问题描述】:

希望你们都做得很好,#stayhome 并保持#socialdistancing :)

flutter_bloc 库确实有一个小问题,希望有人能帮助我。

我有一个 API-Call (moviesStream),它返回一个流。 我想要的是:在该流中的每个yield 上,在我的bloc 中执行yield,因此每个项目都重建我的小部件,而不是在最后为所有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/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)

【问题讨论】:

    标签: flutter dart stream bloc flutter-bloc


    【解决方案1】:

    我认为发生这种情况是因为您正在使用已填充数据的流,因此没有时间来传递数据,因此您只能获得最后一个值。

    如果要检查,请在屈服状态之前添加以下行。

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

    【讨论】:

    • @user12018375 我更新了我的答案。看看它可能对你有帮助,
    • 是的,你是对的。现在它正在“工作”,但我真的不喜欢延迟一些事情。不管怎样,谢谢你。与此同时,我注意到 flutter_bloc 包中有一个 BlocListener,通过这个我能够跟踪状态变化。事件没有延迟。也许我的方法有一些基本错误。不得不再考虑一遍
    • 我正要向您推荐有关 flutter_bloc 的信息,但我没有。如果您觉得它有用,请接受我的回答。 “快乐编码”。
    • 实现我想要实现的目标的方法是什么?我有一个数据流,我想为每个项目一个接一个地构建 UI
    • 如果我必须执行这样的任务,那么我将不会使用 bloc 模式,因为任何事件都不会从用户端发生,在此基础上我必须更改我将使用它创建的列表视图。而不是如果我从服务器获取数据并且它是流形式的,那么我简单地使用 rxdart 或简单的流控制器和流来构建它。
    猜你喜欢
    • 1970-01-01
    • 2014-12-14
    • 2018-12-15
    • 2017-03-17
    • 1970-01-01
    • 2015-05-03
    • 2020-11-27
    • 1970-01-01
    • 2021-05-05
    相关资源
    最近更新 更多