在颤动中从实时数据库中获取空值
Posted
技术标签:
【中文标题】在颤动中从实时数据库中获取空值【英文标题】:getting null from realtime database in flutter 【发布时间】:2021-10-29 11:27:09 【问题描述】:我正在使用 firebase 在颤振中创建一个聊天应用程序,但是我在从实时数据库获取数据时遇到了问题,它是公共聊天,我不确定没有获取数据有什么问题,如果有人的话能帮上忙,不胜感激,谢谢
这是来自 db 的截图 这就是我获取数据的方式
Stream<Event> getMessages()
DatabaseReference databaseReference = FirebaseDatabase(databaseURL: databaseUrl).reference().child('Messages');
return databaseReference.onValue;
这是我的信息流生成器
Expanded(child: Container(
child: StreamBuilder<Event>(
stream: AuthService().getMessages(),
builder: (context,data)
if(data.hasError)
return Center(
child: Text("No data 1"),
);
if(data.connectionState == ConnectionState.done)
if(data.data!.snapshot.exists)
print("data is in done" );
Map<String,dynamic> values = data.data!.snapshot.value;
for(var child in values.values)
var receiverName = child['userName'];
var receiverMessage = child['message'];
var receiverImageUrl = child['imageUrl'];
return Container(
child: Container(
child: Row(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: CircleAvatar(
radius: 30,
backgroundColor: Colors.transparent,
backgroundImage: NetworkImage(receiverImageUrl),
),
),
Expanded(
child: Column(
children: [
Text(receiverName),
Text(receiverMessage)
],
),
)
],
),
),
);
return Center(
child: Text("No data 2"),
);
,
),
)),
【问题讨论】:
【参考方案1】:您的代码中有两个问题。
首先您要读取整个数据库,仅使用Messages
节点。我建议将其更新为:
Stream<Event?> getMessages()
DatabaseReference databaseReference = FirebaseDatabase(databaseURL: databaseUrl).reference().child('Messages');
return databaseReference.onValue;
其次,由于您正在阅读Messages
,因此您的data.data!.snapshot
将收到多条消息。所以像data.data!.snapshot.value['userName']
这样的调用是行不通的,因为你没有说从哪个消息中读取userName
。
您需要循环访问data.data!.snapshot.value.values
,然后在特定子快照上获取['userName']
。
【讨论】:
我已经为循环添加了一些代码,我会再次更新它,请告诉我它是否正确 我已经更新了节点和循环的代码,请您再检查一下代码,谢谢 该更新看起来很合理,并且看起来应该解决我发现的两个问题。还有其他问题吗? 非常感谢您的回答,另一件事是我必须使我的地图具有动态,动态,由于某种原因,当我写字符串,动态时,它显示为空,但是当我写动态时,dynmaic , 它返回数据 嗯,这很有趣。它确实应该是Map<String, dynamic>
,因为 Firebase 实时数据库中的键只能是 String
。我想知道这是图书馆的错误,还是发生了其他事情。以上是关于在颤动中从实时数据库中获取空值的主要内容,如果未能解决你的问题,请参考以下文章