我有一个启动画面和一个
最初的回答: 在构建StreamBuilder时,调用了setState()或markNeedsBuild(),导致出现异常。这个Overlay widget不能被标记为需要构建,因为框架已经在构建widget了。只有当它的祖先之一正在构建时,才可以在构建阶段将widget标记为需要构建。此异常是允许的,因为框架会在构建父级widget之前构建子级widget,这意味着脏的子代始终会被构建。否则,在此构建阶段,框架可能不会访问此widget。在调用setState()或markNeedsBuild()的widget是:Overlay-[LabeledGlobalKey#e0460](state: OverlayState#ab1a5(entries:[OverlayEntry#4e962(opaque: false; maintainState: false), OverlayEntry#7656a(opaque: false; maintainState: true), OverlayEntry#1f86e(opaque: false; maintainState: false), OverlayEntry#05a15(opaque: false; maintainState: true)]))。而当前正在构建的widget是:StreamBuilder(dirty, state: _StreamBuilderBaseState>#f4346)。
我找到的唯一解决办法是使用
StreamBuilder
,它会发出一个包含身份验证状态信息的状态。当认证状态已知时,我想要导航到登录页面或主页。但是当我编写像Navigator.of(context).pushReplacement(...)
这样的代码时,我遇到了...最初的回答: 在构建StreamBuilder时,调用了setState()或markNeedsBuild(),导致出现异常。这个Overlay widget不能被标记为需要构建,因为框架已经在构建widget了。只有当它的祖先之一正在构建时,才可以在构建阶段将widget标记为需要构建。此异常是允许的,因为框架会在构建父级widget之前构建子级widget,这意味着脏的子代始终会被构建。否则,在此构建阶段,框架可能不会访问此widget。在调用setState()或markNeedsBuild()的widget是:Overlay-[LabeledGlobalKey#e0460](state: OverlayState#ab1a5(entries:[OverlayEntry#4e962(opaque: false; maintainState: false), OverlayEntry#7656a(opaque: false; maintainState: true), OverlayEntry#1f86e(opaque: false; maintainState: false), OverlayEntry#05a15(opaque: false; maintainState: true)]))。而当前正在构建的widget是:StreamBuilder(dirty, state: _StreamBuilderBaseState>#f4346)。
我找到的唯一解决办法是使用
Future(...).then(navigate)
将导航安排在事件队列的末尾,但这很麻烦。是否有更好的解决方案?翻译成中文为:我找到的唯一解决办法是使用Future(...).then(navigate)
将导航安排在事件队列的末尾,但这很麻烦。是否有更好的解决方案?