我是个新手,正在尝试使用firebase的实时数据库和StreamBuilder来实现一个应用程序,以不断显示更新手机屏幕上显示的值的数据。
我的问题是,由于某种原因,流只会在我第一次加载并在乳化器中运行main时才返回数据事件(snap.hasData = true),如果我重新加载脚本,则StreamBuilder
会赢't build和snap.hasData == false。我相信代码没有错,因为正如我之前说过的,通过流连接的连接是在我第一次在模拟器中安装并运行应用程序时初始化的
这是我的代码,该屏幕的initSate和版本。
@override
void initState() {
super.initState();
databaseReference
.child('growboxs')
.orderByChild('access')
.equalTo(widget.user)
.once()
.then( (DataSnapshot snapshot) {
String path2child = snapshot.value.toString();
path2child =
'growboxs/' + path2child.substring(1, 18) + '/dashboard';
reference2Dashboard = FirebaseDatabase.instance.reference().child(path2child);
progressController = AnimationController(
vsync: this, duration: Duration(milliseconds: 2000)); //5s
isLoading = true;
});
}
@override
Widget build(BuildContext context) {
return isLoading ?
StreamBuilder(
stream: reference2Dashboard.onValue,
builder: (context, snap) {
if (!snap.hasData) {
return Center(child: CircularProgressIndicator());
}
if (snap.hasData && !snap.hasError &&
snap.data.snapshot.value != null) {
DataSnapshot snapshot = snap.data.snapshot;
doble temperature = snapshot.value['Temperature'].toDouble();
/* keeps on getting values and updating Widget*/
.
.
.
) : Center(child: CircularProgressIndicator());//StreamBuilder
}//build
答案 0 :(得分:0)
您正在reference2Dashboard
中初始化initState
,initState
仅在首次创建状态或销毁状态并且必须重新创建后才运行。热重装不会修改您的状态,因此initState
不会运行。如果您执行热重启,它将仅再次运行。
您可以在FutureBuilder
函数中使用build
,将FutureBuilder
的结果传递给StreamBuilder
,而不必完全使用initState