Как перейти на другую страницу после входа в Google - PullRequest
0 голосов
/ 25 мая 2020
  Future<void> signUpWithGoogle() async {
try {
  final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
  final GoogleSignInAuthentication googleAuth =
      await googleUser.authentication;

  final AuthCredential credential = GoogleAuthProvider.getCredential(
    accessToken: googleAuth.accessToken,
    idToken: googleAuth.idToken,
  );

  final FirebaseUser user =
      (await _auth.signInWithCredential(credential)).user;

  return user;
} catch (error) {
  print(error);
}
}

Я выполнил этот код выше, чтобы войти в систему с помощью google, и вызвал функцию кнопки подписи google, например,

    signUpWithGoogle().then((value) => Navigator.of(context).push(MaterialPageRoute(builder: (_) {
          return HomePage();
        })));

Но в первый раз, когда apk установлен, обычно приложение запрашивает выбор учетной записи Google Но после выхода из системы, когда я нажимаю кнопку входа в Google, она не запрашивает во всплывающем меню выбор учетной записи. И еще одна проблема заключается в том, что они нажимают кнопку входа в Google, сначала она переходит на HomePage (), затем происходит вход в систему.

  @override
void initState() {
super.initState();
getCurrentUser();
}



  Future<void> getCurrentUser() async {
FirebaseUser user = await _auth.currentUser();
bool result = await facebookSignIn.isLoggedIn;
if (user != null && user.isEmailVerified == true) {
  print("Email");
  Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (_) {
    return HomePage();
  }));
} 
 }

Это правильный метод перехода на HomePage () для тех пользователи, которые вошли в систему при запуске приложения

Ответы [ 2 ]

0 голосов
/ 25 мая 2020

во-первых, я тоже новичок в флаттере, поэтому это может быть не лучшее решение, но это то, что я реализую в своем приложении для части аутентификации.

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

final FirebaseAuth _auth = FirebaseAuth.instance;
Stream<FirebaseUser> user; // firebase user


User _userFromFireBaseUser(FirebaseUser user)  {
return user != null ? User(uid: user.uid) : null;
}

// //auth change user stream
Stream<User> get userStream {
return _auth.onAuthStateChanged.map(_userFromFireBaseUser);
// or we can use .map((FirebaseUser user) => _userFromFireBaseUser(user) );
}

в моем основном виджете

StreamProvider<User>.value(
      lazy: false,
      value: AuthService().userStream,
      child: MaterialApp()//your main widget 

, затем я создал класс-оболочку без статистики, который считывает значение потока и в соответствии с переходом на страницу, в моем приложении я использовал оболочку для go для входа в систему, если пользователь имеет значение null else go на страницу профиля, в вашем приложении, я думаю, это будет go на главную страницу

class ProfileWrapper extends StatelessWidget {
@override
Widget build(BuildContext context) {
final user = Provider.of<User>(context);
//print(user.uid);
if (user == null) {
  print('no user');
  return SignUpPage();
} else if (user != null) {
  print('there is user');
  print(user.uid);
  return ProfilePage();

  // print('there is user' + user.displayname);
  // print('there is user' + user.photourl);
 }
 }
 }

также вам нужно добавить пакет провайдера в свой pubspe c .yaml файл

provider: ^4.1.1

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

другое решение, если это не то, что вы ищете, после завершения функции знака Google проверьте, не является ли пользователь firebase равным нулю, если есть пользователь, перейдите на вашу домашнюю страницу

0 голосов
/ 25 мая 2020
  1. Каждый раз, когда пользователь выходит из системы и снова входит в систему с учетной записью Google, android достаточно умен, чтобы предоставить учетную запись Google непосредственно в приложение, не открывая всплывающее окно входа

  2. для вашей второй проблемы, пожалуйста, обратитесь к этому ответу -: Почему функция может не вызываться в initState () {super.initState ()} во флаттере, но отлично работает, если вызывается позже на той же странице?

...