Флаттер FutureBuilder внутри StreamBuilder, нажимающий под текущим экраном

#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 На самом деле, я не думаю, что это проблема, связанная с асинхронной реализацией, поскольку все остальные варианты использования работают. Я думаю, что проблема в том, чтобы проложить маршрут через экран входа в систему, а затем вызвать обработчик авторизации. Я думаю, я мог бы просто зарегистрироваться, но я не хотел полагаться на «логику навигатора».