如何访问与当前窗口小部件具有相同级别的窗口小部件?

时间:2020-04-04 14:55:57

标签: flutter state-management

在我的LoginFormState中,我有

final signInFormKey = LabeledGlobalKey<FormState>("login_form");

static LoginFormState of(BuildContext context) {
    return context.findAncestorStateOfType<LoginFormState>();
  }

我的MainButton状态有这行

LoginFormState.of(context)
                    .signInFormKey
                    .currentState
                    .validate()

这两个都具有相同的父级,它们的父级是一个堆栈小部件:

[
Builder( builder: (BuildContext context) => AnimatedOpacity(
                    opacity: status == 0 ? 0 : 1,
                    duration: Duration(milliseconds: 500),
                    child: LoginForm(),
                  ),
                ),
MainButton(),
]

当我在mainButton状态下调用该函数时,它会记录以下错误:

enter image description here

1 个答案:

答案 0 :(得分:1)

发生错误是因为您在LoginFormState.of()中调用了MainButton方法,而它没有任何LoginForm祖先。

那是您的小部件树:

  • 您未在代码中发布的一些小部件
    • Builder
      • AnimatedOpacity
      • LoginForm
    • MainButton

看到了吗?没有LoginForm“环绕” MainButton

您可能想做的是在LoginFormStateGlobalKey的祖先中声明一个MainButton LoginForm,最接近的是我在 cursive 中标记为上面,然后将其作为构造函数参数传递给LoginForm小部件和MainButton

您还可以创建一个InheritedWidget,它将包装这两个小部件并在其中同时公开SomeName.of()方法,也可以使用provider package,即“ InheritedWidget,但适用于人类”(就像有人在Flutter Europe上所说的那样。