我在扑朔迷离中获得了这段弹出的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
答案 0 :(得分:2)
在读取跟踪打印后,我们可以确定问题是由于FlutterInappPurchase.purchaseUpdated.listen(...)
和FlutterInappPurchase.purchaseError.listen(...)
在关闭对话框之后没有解决。他们使用上下文弹出并打开一个新对话框(对于purchaseError),当时该对话框可能为空。销毁小部件后取消流可解决此问题。很高兴知道可以解决问题
@override
void dispose(){
super.dispose();
_purchaseUpdatedSubscription.cancel();
_purchaseErrorSubscription.cancel();
}