簡體   English   中英

取消 google 登錄對話框 flutter firebase 的無盡進度指示器

[英]Endless progress indicator on cancel of google sign in dialog flutter firebase

當我點擊空白屏幕以取消登錄時。我得到了無盡的加載屏幕。 我無法弄清楚如何在取消時關閉進度指示器。

這是谷歌登錄的代碼:

final googleSignIn = GoogleSignIn();

Future signInGoogle() async {
try {
  final GoogleSignInAccount? googleUser = await googleSignIn.signIn();

  final GoogleSignInAuthentication? googleAuth =
      await googleUser?.authentication;
  final OAuthCredential credential = GoogleAuthProvider.credential(
    accessToken: googleAuth?.accessToken,
    idToken: googleAuth?.idToken,
  );
  final UserCredential userCredential =
      await _firebaseAuth.signInWithCredential(credential);
  final User? user = userCredential.user;
  return _userFromFirebase(user);
} on FirebaseAuthException catch (e) {
  return e.message ?? e.toString();
}
}

在歡迎屏幕上,我使用 bool isLoading 來顯示進度指示器。 當結果 == null 時,我使用 setState 來設置 isLoading = false 但它對我不起作用。 它無休止地顯示加載屏幕。 你知道取消登錄時我必須做什么才能顯示歡迎屏幕嗎?

這是歡迎屏幕的代碼:

bool isLoading = false;

isLoading
    ? const Center(child: CircularProgressIndicator.adaptive())
    : Scaffold(
        appBar: CupertinoNavigationBar(middle: navbarLogo()),
        body: Padding(
          padding: const EdgeInsets.symmetric(horizontal: 15.0),
          child: SafeArea(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Spacer(),
                Center(
                  child: Text('Discover',
                      style: Theme.of(context).textTheme.headline4,
                      textAlign: TextAlign.center),
                ),
                Spacer(),

                ///Google Sign In Button
                SignInButton(
                    widget:
                        Image.asset('images/google-logo.png', height: 22.0),
                    title: 'Continue with Google',
                    onTap: () async {
                      try {
                        setState(() => isLoading = true);
                        final result =
                            await _database.signInGoogle().then((value) {
                          Navigator.of(context).pushNamedAndRemoveUntil(
                              HomeScreen.id,
                              ModalRoute.withName(HomeScreen.id));
                        });
                        if (result == null) {
                          setState(() => isLoading = false);
                          if (kDebugMode) {
                            print('error signing in');
                          }
                        }
                      } on Exception catch (e) {
                        if (kDebugMode) {
                          print(e);
                        }
                      }
                    }),

更新:事情是在此之前一切正常。 位置提供程序也工作正常。 當我這樣做時,它突然因這個錯誤而崩潰。

錯誤:

未處理的異常:錯誤:在此 FeedScreen 小部件上方找不到正確的提供程序

E/flutter (11935):發生這種情況是因為您使用了不包含提供程序的BuildContext

E/顫振(11935):您的選擇。 有幾種常見的場景:

E/顫振(11935):

E/flutter (11935): - 您在main.dart中添加了一個新提供程序並執行了熱重載。

E/flutter (11935):要修復,請執行熱重啟。

E/flutter (11935): - 您嘗試讀取的提供程序位於不同的路徑中。

E/flutter (11935):提供者是“范圍的”。 因此,如果您在路線內插入提供者,那么

E/flutter (11935):其他路由將無法訪問該提供程序。

E/flutter (11935): - 您使用了BuildContext ,它是您嘗試讀取的提供程序的祖先。

E/flutter (11935):確保 FeedScreen 在您的 MultiProvider/Provider 下。

E/flutter (11935):這通常發生在您創建提供程序並嘗試立即讀取它時。

這里的問題是您總是從您的 signInGoogle() 方法返回一些值,因此歡迎屏幕中的結果值永遠不會是 null。 試試這個:修改你的 signInGoogle 以返回 null 如果谷歌登錄不成功並且還有任何異常:

Future signInGoogle() async {
try {
  final GoogleSignInAccount? googleUser = await googleSignIn.signIn();
  if(googleUser == null){
  return null;
  }
  final GoogleSignInAuthentication? googleAuth =
      await googleUser?.authentication;
  final OAuthCredential credential = GoogleAuthProvider.credential(
    accessToken: googleAuth?.accessToken,
    idToken: googleAuth?.idToken,
  );
  final UserCredential userCredential =
      await _firebaseAuth.signInWithCredential(credential);
  final User? user = userCredential.user;
  return _userFromFirebase(user);
} on FirebaseAuthException catch (e) {
   return null;
  //return e.message ?? e.toString();
}
}

暫無
暫無

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

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