![](/img/trans.png)
[英]Progress Indicator when firebase is retrieving data on chat - Flutter
[英]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.