flutter导航器弹出对话框-错误-未处理的异常:NoSuchMethodError:在null上调用了方法'findAncestorStateOfType'

时间:2020-06-14 14:22:03

标签: flutter dialog navigator dismiss

我在扑朔迷离中获得了这段弹出的Dialog()代码 https://gist.github.com/axilaris/2b186c7a4073671128e8cacc09dfc384,如果您在底部的某个位置签出代码

class PurchaseDialog extends StatefulWidget with NavigationStates {
...
class _PurchaseDialogState extends State<PurchaseDialog> {
...
  @override
  Widget build(BuildContext context) {
    return Dialog(
...
 showSecondaryButton(BuildContext context) {
...
Navigator.of(context).pop(); <--- here is the problem

何时调用

Navigator.of(context).pop();

它将导致以下错误

[ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: NoSuchMethodError: The method 'findAncestorStateOfType' was called on null.

这看起来像是这个NoSuchMethodError: The method 'ancestorStateOfType' was called on null with await and async method的副本,但是我尝试了不起作用的解决方案。 (上下文只能设置一次,并且检查装入的变量无效)。

该如何解决?到目前为止,它关闭了该对话框(使用pop()使其行为正确),但是我不希望出现此错误。

更新信息: 上面的PurchaseDialog()以这种方式调用:

    showDialog(
      context: context,
      builder: (BuildContext context) => PurchaseDialog(),
    ).then((value) {
      setState(() {
      });
    });

以下是跟踪打印:https://gist.github.com/axilaris/6d8db8824b0b89e33fee7ddfdd238e34

1 个答案:

答案 0 :(得分:2)

在读取跟踪打印后,我们可以确定问题是由于FlutterInappPurchase.purchaseUpdated.listen(...)FlutterInappPurchase.purchaseError.listen(...)在关闭对话框之后没有解决。他们使用上下文弹出并打开一个新对话框(对于purchaseError),当时该对话框可能为空。销毁小部件后取消流可解决此问题。很高兴知道可以解决问题

@override
void dispose(){
  super.dispose();
  _purchaseUpdatedSubscription.cancel();
  _purchaseErrorSubscription.cancel();
}