首页 > 解决方案 > 未处理的异常:在构造函数中调用 setState():ReservationMakingState#861c9(生命周期状态:已创建,无小部件,未安装)

问题描述

我正在创建一个用于预订船只租赁的应用程序,但我很难解决这个问题,any1 可以提供帮助吗?提供代码示例:


          if (docs.size == 0) {
            reservations.doc(resID).set({
              'resID': resID,
              'name': name,
              "surname": surname,
              "phoneNumber": phoneNumber,
              "rental": ProductCardInCart.rental,
              'boat': ProductCardInCart.boat,
              'date': date,
              'time': time
            }).then((value) {
              print("Reservation made");
              setState(() {
                Body.empty = true;
              });
            }).catchError((error) => print("Failed to reservate: $error"));
          } else if (docs.size != 0) {
            setState(() {
              Body.empty = false;
            });
            print('jestjus');
          }
        });
      } else {
        return;
      }
    });
  }
}

这个 setstate 运行良好

.then((value) {
              print("Reservation made");
              setState(() {
                Body.empty = true;
              });

但这个不是,它的抛出异常

} else if (docs.size != 0) {
            setState(() {
              Body.empty = false;
            });
            print('jestjus');
          }

它抛出的错误:

7980): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: setState() called in constructor: ReservationMakingState#861c9(lifecycle state: created, no widget, not mounted)
E/flutter ( 7980): This happens when you call setState() on a State object for a widget that hasn't been inserted into the widget tree yet. It is not necessary to call setState() in the constructor, since the state is already assumed to be dirty when it is initially created.

提前感谢您的帮助

标签: flutterdartgoogle-cloud-firestore

解决方案


setState不工作的原因是您的小部件仍在构建中。在小部件完成第一次构建之后,它才能更新。

这个工作的原因

.then((value) {
   print("Reservation made");
   setState(() {
     Body.empty = true;
   });
});

是因为它发生在未来之后.then(() {});

如果您希望在初始设置后重建您的小部件,您可以使用
小心使用它。如果您在构建方法中使用它,您将陷入循环!您应该在initState方法中使用它或在运行之前有一些条件语句

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      //do something call your set state here
    });
  }

推荐阅读