【问题标题】:Flutter/Dart "Cannot modify an unmodifiable list" occurs when trying to sort a list that is the snapshot of a stream of lists尝试对作为列表流快照的列表进行排序时发生 Flutter/Dart “无法修改不可修改的列表”
【发布时间】:2020-04-13 18:51:04
【问题描述】:

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

List<User> users = snapshot.data;
users.sort((user1, user2) => (user1.distanceInKm ?? 1000).compareTo(user2.distanceInKm ?? 1000));

如果我为 Streambuilder 使用以下流,则上述排序有效:

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 包):

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;
    }
  }

【问题讨论】:

    标签: sorting flutter dart stream


    【解决方案1】:

    因为,ZipStream.list() 创建了一个新的StreamList.unmodifiable() 列表。

    List<User> users = List.from(snapshot.data); // to convert it editable list
    users.sort((user1, user2) => (user1.distanceInKm ?? 1000).compareTo(user2.distanceInKm ?? 1000));
    

    【讨论】:

      猜你喜欢
      • 2010-12-20
      • 1970-01-01
      • 2021-11-22
      • 2021-02-14
      • 2019-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多