Firebase rtdb 的流构建器是否会更新列表<User>用户数据?



目前我了解streamBuilder方法,我可以获取更新的数据并添加到List<User> users中。

但是,如果这个已经添加到List<User> users中的用户已经更新了数据,那么它可能会在List<User> users中重复添加这个用户数据,对吗?

  1. 你能告诉我如何确认新来的数据List<User> users是否已经有相同的userId吗?如果是,新的数据/userId将取代这个现有的userId?

  2. 如果从Firebase rtdb中删除了该用户,则会通知流,从而从List<User> users中删除该用户?

这里是一个例子,我担心的是,流总是会将数据添加到列表用户中,但如果该用户从数据库中删除或断开连接,该如何从该列表中删除该用户?

_streamSubscription = availableUserStream.onValue.listen((snap) {
if (snap.snapshot.exists && snap.snapshot.value != null) {
DataSnapshot snapshotData = snap.snapshot;

for (var userSnapshot in snapshotData.children) {
final data = Map<String, dynamic>.from(userSnapshot.value as Map);

List<User> users = [];

User newUser = User.fromJson(data);

users.add(newUser);
firebaseController.setUsers(users: users);

}
}
});

所以我想在这里做一个双重确认,如果这个用户仍然存在于数据库中:

User getRandomSenderUser({User asReceiverUser}) {
if (availableSenderUsersList.isNotEmpty) {
final random = Random();
var i = random.nextInt(availableSenderUsersList.length);
User randomUser = availableSenderUsersList[i];
bool thisRandomUserIsAvailable; //TODO

我不知道如何进行此检查,例如,如果此randomerUser不可用,所以我需要获取下一个randomUser,所以它应该是一个循环?但这会减缓反应速度。

updateSenderUserAvailableStatus(asReceiverUser:asReceiverUser,connectionUser: randomUser);

return randomUser;
} else {
return null;
}
}

thank you!

更新

这是示例代码,所以现在我知道流会将用户数据传递给List<User> users,但按照我的方式,总会有用户以前被添加到这个列表中,但已经从数据库中删除了,我的计划是在获得randomUser时使用while loop进行双重确认,以删除不可用的用户,但我想这听起来不明智,仍然浪费时间。。。。

@override
void initState() {
_listenAvailableUsers();
}
_listenAvailableUsers() {
var availableUserStream =
FirebaseDatabase.instance.ref().child('/waitingList');

_streamSubscription = availableUserStream.onValue.listen((snap) {
if (snap.snapshot.exists && snap.snapshot.value != null) {
DataSnapshot snapshotData = snap.snapshot;

for (var userSnapshot in snapshotData.children) {
final data = Map<String, dynamic>.from(userSnapshot.value as Map);

List<User> users = [];

User newUser = User.fromJson(data);

users.add(newUser);
firebaseController.setUsers(users: users);


}
}
});
}

以下是我想要确认randomUser是否仍存在于数据库中的方法:

Future<User> getRandomSenderUser({User asReceiverUser}) async {
if (availableSenderUsersList.isNotEmpty) {
User randomUser;
while (true) {
final random = Random();
var i = random.nextInt(availableSenderUsersList.length);
randomUser = availableSenderUsersList[i];
DatabaseEvent event = await databaseReference
.child('/waitingList/${randomUser.userId}')
.once();
print('randomUser is ${randomUser.toString()}');
if (event.snapshot.value != null) {
break;
}
}
await updateSenderUserAvailableStatus(
asReceiverUser: asReceiverUser, connectionUser: randomUser);
print('connectionUserId is $connectionUserId');
return randomUser;
} else {
return null;
}
}

由于您正在侦听数据库中某个路径的onValue,因此您获得的DataSnapshot将包含该路径上的全部数据。当数据只有一个小的变化时,服务器只会将更新发送到客户端,但SDK会将其与现有数据合并,并仍然触发一个事件,其中包含路径上所有数据的快照。

由于每次从流中获得事件时,您都从一个空列表(List<User> users = [];(开始,这意味着每次都要重建整个用户,这在我看来是正确的

相关内容

最新更新