StreamBuilder 中的数据在 Firebase RTDB get() 调用之外不断返回 null

时间:2021-08-01 20:50:22

标签: firebase flutter dart firebase-realtime-database

出于某种原因,我的数据变量在我的 .get() 调用之外一直返回 null。在 .get() 调用中,当我打印数据时,我得到了预期的地图。任何见解表示赞赏!给我带来问题的代码部分标有星号。

class _MessagesScreenState extends State<MessagesScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Column(
          children: <Widget>[
            Expanded(
              child: Container(
                decoration: BoxDecoration(
                  color: Colors.white,
                ),
                child: StreamBuilder(
                    stream: rtdb
                        .child('messages')
                        .child(widget.currentUserID)
                        .onValue,
                    builder: (context, snapshot) {
                      final messageList = <BuildMessages>[];
                      if (snapshot.hasData) {
                        final users = Map<String, dynamic>.from(
                            snapshot.data.snapshot.value);
                        users.forEach((key, value) {
                          **var data;**
                          **usersRef.child(key).get().then((value) {
                            data = new Map<String, dynamic>.from(value.value);
                          });**
                          final messageTile = BuildMessages(
                            name: data['userFirstName'] +
                                ' ' +
                                data['userLastName'],
                            picture: data['userImageUrl'],
                            otherID: data['userID'],
                          );
                          ;
                          messageList.add(messageTile);
                        });
                      }
                      return ListView.builder(
                        padding: EdgeInsets.only(top: 15.0),
                        itemCount: messageList.length,
                        itemBuilder: (context, index) {
                          return messageList[index];
                        },
                      );
                    }),
              ),
            ),
          ],
        ),
    );
  }

1 个答案:

答案 0 :(得分:1)

这是预期的行为。 usersRef.child(key).get() 返回 Future<DataSnapshot?>,因此您需要将其包装到 FutureBuilder 中以使用其值。

基于 this answer 这将类似于:

FutureBuilder<DataSnapshot?>(
  future: usersRef.child(key).get(), // async work
  builder: (BuildContext context, AsyncSnapshot<DataSnapshot?> snapshot) {
    switch (snapshot.connectionState) {
      case ConnectionState.waiting: return Text('Loading....');
      default:
        if (snapshot.hasError)
          return Text('Error: ${snapshot.error}');
        else
          return Text('Result: ${snapshot.data!.value}');
    }
  },
)