You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中Navigator.pop无法关闭全屏对话框的问题求助

问题排查与修复

核心错误1:未调用pop方法

你的代码里这一行存在语法问题:

Navigator.of(context).pop;

这里只是引用了pop方法对象,没有执行它,正确写法必须加上括号调用方法:

Navigator.of(context).pop();

核心错误2:异步操作未等待完成

recordTransaction是异步方法,你直接调用后立刻执行setState和pop,会导致数据库写入操作还没完成,页面就已经关闭,同时UI加载状态也会异常。需要用await等待异步操作执行完毕:

修改后的按钮点击逻辑:

onPressed: () async { // 添加async关键字
  fnDate.unfocus();
  fnAmount.unfocus();
  fnPayee.unfocus();
  fnAccount.unfocus();
  fnJob.unfocus();
  fnCostCode.unfocus();
  fnMemo.unfocus();

  if (_formKey.currentState!.validate()) {
    setState(() {
      isProcessing = true;
    });

    // 等待数据库写入完成
    await recordTransaction(
      _dateController.text.trim(),
      _amountController.text.trim(),
      _payeeController.text.trim(),
      _accountController.text.trim(),
      _jobController.text.trim(),
      _costCodeController.text.trim(),
      _memoController.text.trim(),
    );

    setState(() {
      isProcessing = false;
    });

    Navigator.of(context).pop(); // 正确调用pop方法
  }
},

额外优化建议

  • 全屏对话框的关闭逻辑和普通页面一致,你的代码中使用的context是有效的导航上下文,修复上述问题后即可正常关闭页面。
  • 建议在异步操作中添加错误捕获,避免操作失败后UI一直处于加载状态:
Future recordTransaction(
  final String date,
  final String amount,
  final String payee,
  final String account,
  final String job,
  final String costCode,
  final String memo,
) async {
  try {
    await FirebaseFirestore.instance.collection('transactions').add({
      'date': date,
      'amount': amount,
      'payee': payee,
      'account': account,
      'job': job,
      'cost code': costCode,
      'memo': memo,
    });
  } catch (e) {
    if (mounted) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('添加交易失败:$e')),
      );
    }
  }
}

内容的提问来源于stack exchange,提问作者Andy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 15:10:24