簡體   English   中英

Flutter / Firebase 谷歌登錄跳過正常流程

[英]Flutter / Firebase google sign in skips normal flow

我在使用 google 登錄時遇到了一些問題。它有效 - 它讓我登錄,但屏幕只是有點閃爍,並且您選擇帳戶的登錄流程從未出現,然后它只是用我的主要 google 登錄帳戶。 不知道我做錯了什么。

它不是正常的行為。 我認為通常會彈出一個小對話框,您有機會選擇要登錄的谷歌帳戶。 這是沒有發生的部分。 我什至在我的手機上嘗試過,之前從未安裝過 apk 並且從未看到該對話框,但它使用默認帳戶為我簽名。

非常感謝任何幫助:

general_providers.dart

import 'package:firebase_auth/firebase_auth.dart';
import 'package:riverpod/riverpod.dart';

final firebaseAuthProvider =
    Provider<FirebaseAuth>((ref) => FirebaseAuth.instance);

final authStateChangesProvider = StreamProvider<User?>(
    (ref) => ref.watch(firebaseAuthProvider).authStateChanges());

auth_widget.dart。 -> 這個只是顯示主頁或登錄頁面,具體取決於身份驗證 state:

class AuthWidget extends ConsumerWidget {
  const AuthWidget({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final authStateChanges = ref.watch(authStateChangesProvider);
    return authStateChanges.when(
      data: (user) => user != null ? const HomePage() : LoginPage(),
      loading: () => const Center(child: CircularProgressIndicator()),
      error: (error, __) => Scaffold(
        body: Center(
          child: Text(error.toString()),
        ),
      ),
    );
  }
}

firebase_auth_service.dart

final authServiceProvider =
    Provider<FirebaseAuthService>((ref) => FirebaseAuthService(ref.read));

class FirebaseAuthService {
  FirebaseAuthService(this._read);

  final Reader _read;

//TODO add in try / catch with firebase exeptions

  Future<void> signInAnonymously() async {
    await _read(firebaseAuthProvider).signInAnonymously();
  }

  User? getCurrentUser() => _read(firebaseAuthProvider).currentUser;

  Future<void> signOut() async {
    await _read(firebaseAuthProvider).signOut();
  }

  Future<UserCredential> signInWithGoogle() async {
    try {
      // await _googleSignIn.signIn();
      final GoogleSignInAccount? googleUser = await GoogleSignIn().signIn();
      // Obtain the auth details from the request
      final GoogleSignInAuthentication? googleAuth =
          await googleUser?.authentication;
      // Create a new credential
      final credential = GoogleAuthProvider.credential(
        accessToken: googleAuth?.accessToken,
        idToken: googleAuth?.idToken,
      );

      return await _read(firebaseAuthProvider).signInWithCredential(credential);
    } catch (error) {
      throw FirebaseAuthException(code: error.toString());
    }
  }
}

上面的 signInWithGoogle 方法幾乎是從文檔中復制粘貼,除了我在最后一行鏈接我的 firebaseAuthProvider 以獲取頂級身份驗證實例。 當我從登錄頁面運行此方法時,它確實讓我登錄,但只是跳過了正常流程。 有任何想法嗎?

我認為這是預期的行為。 您需要先注銷,然后才能再次訪問 select 帳戶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM