【问题标题】:StreamBuilder stream not connectingStreamBuilder 流未连接
【发布时间】:2020-07-10 06:37:28
【问题描述】:

我是一个新手,我正在尝试使用 firebase 的实时数据库和 StreamBuilder 来实现一个应用程序,以不断地显示更新手机屏幕上显示的值的数据。 我的问题是,由于某种原因,流只会在我第一次加载并将 main 运行到 emultor 时返回数据事件(snap.hasData = true),如果我热重新加载脚本,我的StreamBuilder 不会构建和 ​​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

【问题讨论】:

    标签: firebase flutter stream builder


    【解决方案1】:

    您在initState 中初始化reference2DashboardinitState 仅在您的状态第一次创建或在您的状态被销毁并且必须再次创建之后运行。 Hot Reload 不会修改您的状态,因此initState 不会运行。它只会在您进行热重启时再次运行。

    您可以在build 函数中使用FutureBuilder,将FutureBuilder 的结果传递给StreamBuilder,根本不必使用initState

    【讨论】:

    • 非常感谢,我试试看。
    • 嗨,又是我,希望这不会给您带来麻烦。所以我已经尝试了你的建议,但我遇到了一些不寻常的行为。作为 FutureBuilder 的未来,我正在调用一个返回 DatabaseReference 的函数,而对于它的构建器 StreamBuilder,问题是我的动画会随着每个流事件而重新启动。
    • 这取决于您如何设置动画开始。如果你让它们在StreamBuilderbuilder函数上启动,那么它将一直重启。您可以查看动画功能,您可以查看动画是否正在播放,如果是,则不要重新启动它。此外,您可以查看隐式动画小部件,有时它们已经足够了。
    • 如果这个答案解决了你原来的问题,别忘了接受并投票。
    猜你喜欢
    • 2022-08-16
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多