微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 RxDart 中执行 switchmap 或任何更好的方法来替换值

如何解决如何在 RxDart 中执行 switchmap 或任何更好的方法来替换值

我有一个包含聊天室信息的集合。像这样:

{
  chatroomid: 59,members: [2,3]
}

现在我想要做的是,获取集合流,在此过程中能够根据成员 id 将成员字符串 id 替换为相应的 Firestore 文档。

最终结果应该是这样的:

{
chatroomid: 59,members: [{
  id: 2,username: Johndoe1
},{
  id: 3,username: Jennydoe1
}]
}

这可以用 Dart RxDart 实现吗? 尝试这样的事情失败了:

  getChatroomStream(chatroomid)
  .switchMap((i) {
    return Stream.value(i.members.map((e) => i.members.add(Document(path: 'Global.userRef/$e').streamData())));
  })
  
  .listen((event) {print(event);}); 

[VERBOSE-2:ui_dart_state.cc(177)] 未处理的异常:并发 迭代期间的修改:实例 'MappedListIterable'。 #0 ListIterator.moveNext (dart:_internal/iterable.dart:337:7)

解决方法

class MemberInfo {
  final int id;
  final String? username;
  final bool isLoading;
}

class Room {
  final int chatroomid;
  final List<int> members;
}

class RoomWithMemberInfos {
  final int chatroomid;
  final List<MemberInfo> infos;

  factory RoomWithMemberInfos.initial(Room room) {
     return RoomWithMemberInfos(
       room.chatroomid,room.members
         .map((id) => MemberInfo(id,null,true))
         .toList(growable: false)
     );
  }

  RoomWithMemberInfos withInfo(MemberInfo info) {
      return RoomWithMemberInfos(
        chatroomid,infos
         .map((e) => e.id == info.id ? MemberInfo(e.id,info.name,false) : e)
         .toList(growable: false)
      );
  }
}

Stream<MemberInfo> getMemberInfo(int id) { ... }

getChatroomStream()
  .switchMap((Room room) {
      final initial = RoomWithMemberInfos.initial(room);
      return Stream
         .fromIterable(room.members)
         .flatMap(getMemberInfo)
         .scan<RoomWithMemberInfos>(
            (acc,info) => acc!.withInfo(info),initial,)
         .startWith(initial);
  });

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。