Как получить доступ к виджету того же уровня, что и текущий виджет во флаттере? - PullRequest
0 голосов
/ 04 апреля 2020

В моем 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 Ответ

1 голос
/ 04 апреля 2020

Ошибка возникает из-за того, что вы вызываете метод LoginFormState.of() в вашем MainButton, и у него нет предка LoginForm.

Это ваше дерево виджетов:

  • какой-то виджет, который вы не опубликовали в коде
    • Builder
      • AnimatedOpacity
      • LoginForm
    • MainButton

Видите? Там нет LoginForm, «окружающего» * ​​1030 *.

. Что вы можете сделать, это объявить LoginFormState GlobalKey в предке как MainButton и LoginForm, так и ближайший один - тот, который я отмечал выше в cursive и затем передаю его и вашему LoginForm виджету и MainButton в качестве параметров конструктора.

Вы также можете создать InheritedWidget, который будет оберните оба этих виджета и откройте для них метод SomeName.of(), вы также можете использовать пакет поставщика , который называется «InheritedWidget, но для людей» (как кто-то сказал об этом на Flutter Europe) .

...