首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试对作为列表流快照的列表进行排序时,出现Flutter/Dart "Cannot modify an unmodifiable“(无法修改不可修改的列表)

尝试对作为列表流快照的列表进行排序时,出现Flutter/Dart "Cannot modify an unmodifiable“(无法修改不可修改的列表)
EN

Stack Overflow用户
提问于 2019-12-22 03:08:30
回答 1查看 3.1K关注 0票数 2

这是导致问题的Streambuilder的builder方法中的代码:

代码语言:javascript
复制
List<User> users = snapshot.data;
users.sort((user1, user2) => (user1.distanceInKm ?? 1000).compareTo(user2.distanceInKm ?? 1000));

如果我对Streambuilder使用下面的流,上面的排序是有效的:

代码语言:javascript
复制
static Stream<List<User>> getUsersStreamWithDistance(
      {@required User loggedInUser}) {
    try {
      var userSnapshots = _fireStore.collection('users').snapshots().map(
          (snap) => snap.documents
                  .map((doc) => User.fromMap(map: doc.data))
                  .where((user) => user.email != loggedInUser.email)
                  .map((user) {
                user.updateDistanceToOtherUser(otherUser: loggedInUser);
                return user;
              }).toList());
      return userSnapshots;
    } catch (e) {
      print(e);
      return null;
    }
  }

但当我使用下面的流时就不会了,这是我需要的流(ZipStream来自rxdart包):

代码语言:javascript
复制
static Stream<List<User>> getSpecifiedUsersStreamWithDistance(
      {@required User loggedInUser, @required List<String> uids}) {
    try {
      List<Stream<User>> listOfStreams = [];
      for (var uid in uids) {
        Stream<User> streamToAdd = _fireStore
            .collection('users')
            .where('email', isEqualTo: uid)
            .snapshots()
            .map((snap) => snap.documents
                    .map((doc) => User.fromMap(map: doc.data))
                    .map((user) {
                  user.updateDistanceToOtherUser(otherUser: loggedInUser);
                  return user;
                }).toList()[0]);
        listOfStreams.add(streamToAdd);
      }

      Stream<List<User>> usersStream = ZipStream.list(listOfStreams);

      return usersStream;
    } catch (e) {
      print(e);
      return null;
    }
  }
EN

回答 1

Stack Overflow用户

发布于 2019-12-22 04:40:36

因为,ZipStream.list()创建了一个新的Stream of List.unmodifiable() list。

代码语言:javascript
复制
List<User> users = List.from(snapshot.data); // to convert it editable list
users.sort((user1, user2) => (user1.distanceInKm ?? 1000).compareTo(user2.distanceInKm ?? 1000));
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59439109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档