Как решить 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
акция называется. Я думаю, что здесь возникает ошибка, но я не могу понять, как это исправить начисто.
Если бы кто-то мог предоставить пример рабочего кода и объяснение, это было бы здорово!