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
相关产品推荐
相关产品推荐

