【问题标题】:Flutter - Unable to navigate away/show dialog when snapshot error occursFlutter - 发生快照错误时无法导航/显示对话框
【发布时间】:2020-04-12 06:37:32
【问题描述】:

我得到了这个简单的构建函数,当snapshot 出现错误时,它应该会显示一个对话框,但是如果没有出现以下错误,我就无法这样做:

flutter:以下断言被抛出构建 FutureBuilder(脏,依赖:颤振: [_LocalizationsScope-[GlobalKey#f4f3f],_InheritedTheme],状态: 颤动:_FutureBuilderState#175f8):颤动: 在构建期间调用 setState() 或 markNeedsBuild()。扑腾:这个 叠加小部件无法标记为需要构建,因为 框架已经在颤抖:构建小部件的过程。一种 小部件可以在构建阶段标记为需要构建 颤振:仅当其祖先之一正在构建时。这 允许异常是因为框架颤动:构建父级 孩子之前的小部件,这意味着肮脏的后代将永远是 建成。 flutter:否则,框架可能不会访问这个小部件 在此构建阶段。 flutter: setState() 或 markNeedsBuild() 被称为:颤振:
叠加层-[LabeledGlobalKey#07fd4]

代码:

showUnknownErrorAlertDialog(BuildContext context, [void Function() onClose]) {

  showDialog(
    context: context,
    builder: (BuildContext builderContext) {

      return AlertDialog(
        title: Text(AppLocalizations.of(builderContext).lang['unknownError']),
        actions: <Widget>[

          FlatButton(
            child: Text(AppLocalizations.of(builderContext).lang['close']),
            onPressed: () {
              Navigator.of(builderContext).pop();

              if (onClose != null) {
                onClose();
              }
            },
          ),
        ],
      );
    }
  );
}

goBack() {
  locator<AppNavigation>().navigateTo('gameOverview', AppGameArgs(gameName));
}

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: getGameSession(),
      builder: (context, AsyncSnapshot<DocumentSnapshot> snapshot) {

        if (snapshot.hasError) {

          return showUnknownErrorAlertDialog(context, () {
            goBack();
          });
        }
        / ... omitted code .../

如果出现错误时不允许显示对话框或立即离开,我应该如何处理构建函数中的错误?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    您不能直接从FuturBuilder 返回dialog。您必须使用showDialog() 来显示任何对话框,如果您在对话框中使用导航,则单击事件将用作对话框而不是页面的导航。

    if(snapshot.hasError()){
      showDialog(showUnknownErrorAlertDialog(context, () {
                Navigator.of(context).pop(1);
              })).then((value){
            if(value=null && value==1)
                goBack();
       });
       return Container();
    }
    

    您可以从对话框中返回值并检查结果并在那里运行您的 goBack()

    【讨论】:

      猜你喜欢
      • 2021-01-02
      • 2021-01-17
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      • 2016-05-11
      • 1970-01-01
      • 2018-06-03
      • 1970-01-01
      相关资源
      最近更新 更多