StreamBuilder 流未连接
StreamBuilder stream not connecting
我是 flutter 的新手,我正在尝试使用 firebase 的实时数据库和 StreamBuilder 来实现一个应用程序,以不断显示更新 phone 屏幕中显示的值的数据。
我的问题是,出于某种原因,流将 return 一个数据事件(snap.hasData = true)仅在我第一次加载时 运行 主要进入 emultor,如果我热重载脚本,我的 StreamBuilder
不会构建并且 snap.hasData == false。我相信代码没有错,因为正如我之前所说,通过流的连接在我第一次安装和 运行 模拟器中的应用程序时被初始化
这是我的代码,这个屏幕的初始状态和构建。
@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
您正在 initState
中初始化 reference2Dashboard
,initState
仅在 运行 之后首次创建您的状态或在您的状态被销毁后必须重新创建。热重载不会修改您的状态,因此 initState
不会 运行。如果您执行热重启,它只会再次 运行。
您可以在 build
函数中使用 FutureBuilder
,将 FutureBuilder
的结果传递给 StreamBuilder
,而不必使用 initState
完全没有。
我是 flutter 的新手,我正在尝试使用 firebase 的实时数据库和 StreamBuilder 来实现一个应用程序,以不断显示更新 phone 屏幕中显示的值的数据。
我的问题是,出于某种原因,流将 return 一个数据事件(snap.hasData = true)仅在我第一次加载时 运行 主要进入 emultor,如果我热重载脚本,我的 StreamBuilder
不会构建并且 snap.hasData == false。我相信代码没有错,因为正如我之前所说,通过流的连接在我第一次安装和 运行 模拟器中的应用程序时被初始化
这是我的代码,这个屏幕的初始状态和构建。
@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
您正在 initState
中初始化 reference2Dashboard
,initState
仅在 运行 之后首次创建您的状态或在您的状态被销毁后必须重新创建。热重载不会修改您的状态,因此 initState
不会 运行。如果您执行热重启,它只会再次 运行。
您可以在 build
函数中使用 FutureBuilder
,将 FutureBuilder
的结果传递给 StreamBuilder
,而不必使用 initState
完全没有。