#flutter #dart
Вопрос:
Я использую FirebaseAuth для аутентификации своих пользователей с помощью пользовательского бэкенда, где мне нужно перехватить имя пользователя после создания учетной записи пользователем и перед отображением главной страницы, поэтому я использую StreamBuilder для запроса Firebase и, внутри, FutureBuilder для запроса моего бэкенда.
Это мой домашний маршрут в приложении Material:
Widget handleAuthState() {
return StreamBuilder<User?>(
stream: _auth.authStateChanges(),
builder: (ctx, snapshot) {
if (snapshot.hasData) { // Firebase User logged
String uid = snapshot.data!.uid;
String userExistsRoute = "/api/user/$uid/exits";
return FutureBuilder<Map<String, dynamic>?>(
future: ApiManager().getRequest(userExistsRoute),
builder: (ctx, snapshot) {
if (snapshot.hasData) {
if (snapshot.data!["exits"]) // user already registered in custom backend
return HomeScreen();
else // user needs an username to register
return UsernameScreen();
} else // loading...
return Container();
},
);
} else { // Firebase user signed out
return LoginScreen();
}
},
);
}
Проблема в том, что экран входа в систему(A) перемещается на экран регистрации(B), где создание учетной записи перенаправляется на экран имени пользователя в разделе B, а создание ее с экрана имени пользователя над A.
Комментарии:
1. @pskink На самом деле, я не думаю, что это проблема, связанная с асинхронной реализацией, поскольку все остальные варианты использования работают. Я думаю, что проблема в том, чтобы проложить маршрут через экран входа в систему, а затем вызвать обработчик авторизации. Я думаю, я мог бы просто зарегистрироваться, но я не хотел полагаться на «логику навигатора».