0

我在小部件树中遇到了 Flutter 路由和重复 GlobalKey 的问题。

我的应用程序执行以下操作:

Screen_A -> Screen_B -> Screen_C

在每种情况下,导航 (->) 都是通过以下方式完成的(其中 * 是 B 或 C):

Navigator.push(context, MaterialPageRoute(builder: (context) => Screen_*()));

然后我通过以下方式导航Screen_C -> Screen_A

Navigator.pushAndRemoveUntil(context, 
    MaterialPageRoute(builder: (context) => Screen_A()), 
    (Route<dynamic> route) => false);

最后,我Screen_A -> Screen_B使用原始Navigator.push方法进行导航。我收到以下错误:

'package:flutter/src/widgets/will_pop_scope.dart':断言失败:第 135 行 pos 12:'route == ModalRoute.of(context)':不正确。

小部件库捕获的异常:在小部件树中检测到重复的 GlobalKey。

作为参考,Screen_B是我通过以下方式定义 GlobalKey 的一种形式:

GlobalKey<FormState> formKey = GlobalKey<FormState>();

我无法弄清楚为什么会发生这种情况。看来我在哪里定义 GlobalKey 以及我如何路由是正确的方式。不应该Navigator.pushAndRemoveUntil删除路由堆栈历史记录,从而删除旧的 GlobalKeyScreen_B吗?

4

1 回答 1

1

已解决:解决方案原来是放置 GlobalKey 声明的地方。我以前在我的有状态小部件之外有它,如下所示:

GlobalKey<FormState> formKey = GlobalKey<FormState>();
class Screen_B extends StatefulWidget { (etc.) }
class _Screen_B extends State<Screen_B > { (etc.) }

但是将其移入State<Screen_B> 后,我的问题就解决了。像这样:

class Screen_B extends StatefulWidget { (etc.) }
class _Screen_B extends State<Screen_B > { 
    GlobalKey<FormState> formKey = GlobalKey<FormState>();
    (etc.) 
}

===== 另外,正如上面提到的 ikerfah,从 Screen_A -> Screen_B -> Screen_C 使用 pushReplacement() 也同样有效。

于 2021-10-16T23:50:01.900 回答