Как решить Flutter: необработанное исключение: поиск предка деактивированного виджета небезопасен

Я пытаюсь отправить электронное письмо пользователю для проверки его/ее учетной записи после регистрации. Кроме того, я автоматически перехожу на новый экран всякий раз, когда пользователь входит в систему.

Это ошибка, которую я получаю:

      E/flutter ( 8107): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: Looking up a deactivated widget's ancestor is unsafe.
E/flutter ( 8107): At this point the state of the widget's element tree is no longer stable.
E/flutter ( 8107): To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.
E/flutter ( 8107): #0      Element._debugCheckStateIsActiveForAncestorLookup.<anonymous closure> (package:flutter/src/widgets/framework.dart:4153:9)
E/flutter ( 8107): #1      Element._debugCheckStateIsActiveForAncestorLookup (package:flutter/src/widgets/framework.dart:4167:6)
E/flutter ( 8107): #2      Element.getElementForInheritedWidgetOfExactType (package:flutter/src/widgets/framework.dart:4193:12)
E/flutter ( 8107): #3      ProviderScope.containerOf (package:flutter_riverpod/src/framework.dart:97:12)
E/flutter ( 8107): #4      ConsumerStatefulElement.read (package:flutter_riverpod/src/consumer.dart:487:26)
E/flutter ( 8107): #5      SignUpScreen.build.<anonymous closure> (package:scial/screens/sign_up/sign_up_screen.dart:97:31)
E/flutter ( 8107): <asynchronous suspension>

Это фрагмент кода из регистрации:

      await auth.createUserWithEmailAndPassword(email: email, password: password);
await dynamicLinksService.sendEmailVerificationEmail(context, user: auth.currentUser!);

Это поток, который проверяет, есть ли текущий пользователь:

      Stream<UserMode> get currentUserMode => auth.authStateChanges().map((User? user) => user != null ? user.emailVerified ? UserMode.isEmailVerified : UserMode.isAvailable : UserMode.none);

Это важный фрагмент моего GoRouter:

      final GoRouter router = GoRouter(
  refreshListenable: isAuthenticatedListenable,
  redirect: (GoRouterState state) {
    UserMode? userMode = isAuthenticatedListenable.value;

    bool isBase = state.subloc == '/';
    bool isAuthenticating = state.subloc == '/signin' || state.subloc == '/signup';
    bool isEmailVerifying = state.subloc == '/verify';

    if (userMode == null && !isBase) return '/';
    if (userMode == UserMode.none && !isAuthenticating) return '/signin';
    if (userMode == UserMode.isAvailable && !isEmailVerifying) return '/verify';

    return null;
  },
  routes: <GoRoute>[
    GoRoute(
      path: '/',
      builder: (BuildContext context, GoRouterState state) {
        return Container(color: Colors.blue);
      }
    ),
    GoRoute(
      path: '/signin',
      name: 'signin',
      builder: (BuildContext context, GoRouterState state) {
        return const SignInScreen();
      }
    ),
    GoRoute(
      path: '/signup',
      name: 'signup',
      builder: (BuildContext context, GoRouterState state) {
        return const SignUpScreen();
      }
    ),
    GoRoute(
      path: '/verify',
      name: 'verify',
      builder: (BuildContext context, GoRouterState state) {
        return const VerifyScreen();
      }
    )
  ]
);

Это означает, что сразу после регистрации приложение показывает новый экран, и при этом или, может быть, даже после этого, sendVerificationLinkакция называется. Я думаю, что здесь возникает ошибка, но я не могу понять, как это исправить начисто.

Если бы кто-то мог предоставить пример рабочего кода и объяснение, это было бы здорово!

0 ответов

Другие вопросы по тегам