Flutter: проблема с Firebase и навигацией - PullRequest
0 голосов
/ 19 июня 2020

Я использую следующий простой код для всего процесса входа / регистрации:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamProvider<FirebaseUser>.value(
      value:  _auth.onAuthStateChanged,
      child: MaterialApp(
        home: Wrapper(),
      ),
    );
  }
}

class Wrapper extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final firebaseuser = Provider.of<FirebaseUser>(context);

    // return either Home or Authenticate widget:
    if (firebaseuser == null) {
      return WelcomeScreen();
    } else {
      return StreamProvider<MyUser>.value(
        value: FirestoreService(uid: firebaseuser.uid).user,
        child: MaterialApp(
          home: HomeWrapper(),
        ),
      );
    }
  }
}

Как видите, я использую второй StreamProvider для моей модели пользователя (с пользовательскими данными), который заполняется в то же время он создается или входит в систему:

  @override
  Future<MyUser> signUp(String email, String password, Extrainfo info) async {
    try {
      AuthResult result = await _auth.createUserWithEmailAndPassword(email: email, password: password);
      FirebaseUser firebaseUser = result.user;

      // create a new document for the user with the uid
      FirestoreService().createUser(firebaseUser.uid,email,extrainfo);

      return _userFromFirebaseUser(firebaseUser);
    } catch (e) {
      //print(e.toString());
      //return e.toString();
    }
  }

Обычно пользователи регистрируются / входят в систему WelcomeScreen(), а затем второй stream (MyUser) запускает построение HomeWrapper() (из где у меня есть все данные пользователя). Пользователи перенаправляются сюда автоматически.

Проблема: : все работает нормально , если я не введу навигацию в WelcomeScreen(). Мне нужно, чтобы внутри было несколько экранов, но как только я это сделаю, при регистрации экран автоматически не изменится на HomeWrapper() (хотя значение потока вызывается). Этого не происходит при входе в систему, так как вызывается onAuthStateChanged и повторная сборка запускается выше в дереве виджетов.

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

1 Ответ

2 голосов
/ 21 июня 2020

правильным образом, я просто предлагаю вам перейти на главный экран только после того, как пользователь был успешно зарегистрирован; я имею в виду SignUpScreen.

, когда вы вызываете свою функцию signUp: с then(/*navigation callback*/) вместо использования потока в вашей оболочке. просто удалите его и попробуйте вот так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...