Isa*_*aak 1 sorting stream dart flutter
这是导致问题的 Streambuilder 的 builder 方法中的代码:
List<User> users = snapshot.data;
users.sort((user1, user2) => (user1.distanceInKm ?? 1000).compareTo(user2.distanceInKm ?? 1000));
Run Code Online (Sandbox Code Playgroud)
如果我为 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;
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我使用以下流时,这是我需要的(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;
}
}
Run Code Online (Sandbox Code Playgroud)
因为,ZipStream.list()创建了一个新Stream的List.unmodifiable()列表。
List<User> users = List.from(snapshot.data); // to convert it editable list
users.sort((user1, user2) => (user1.distanceInKm ?? 1000).compareTo(user2.distanceInKm ?? 1000));
Run Code Online (Sandbox Code Playgroud)