J'ai le code suivant que j'utilise pour connecter un utilisateur en mode silencieux
PlatformException (PlatformException(sign_in_required, com.google.android.gms.common.api.ApiException: 4: 4: , null))
Si l'utilisateur ne peut pas se connecter en mode silencieux, cela entraîne une erreur.
try {
result = await GoogleSignIn().signInSilently().catchError((x) {
print(x);
});
} catch (e) {
print(e);
}
Le problème que j'ai est que je n'arrive pas à saisir l'exception. catchError ni le bloc catch ne sont touchés. Comment attraper cette erreur?
4 Réponses :
Cela pourrait aider .
Listes de contrôle:
Salut, merci pour votre contribution. Le problème est que le code catch n'est jamais atteint.
Procédez comme suit dans votre méthode
/// Attempts to sign in a previously authenticated user without interaction.
///
/// Returned Future resolves to an instance of [GoogleSignInAccount] for a
/// successful sign in or `null` if there is no previously authenticated user.
/// Use [signIn] method to trigger interactive sign in process.
///
/// Authentication process is triggered only if there is no currently signed in
/// user (that is when `currentUser == null`), otherwise this method returns
/// a Future which resolves to the same user instance.
///
/// Re-authentication can be triggered only after [signOut] or [disconnect].
///
/// When [suppressErrors] is set to `false` and an error occurred during sign in
/// returned Future completes with [PlatformException] whose `code` can be
/// either [kSignInRequiredError] (when there is no authenticated user) or
/// [kSignInFailedError] (when an unknown error occurred).
Future<GoogleSignInAccount> signInSilently({bool suppressErrors = true}) {
final Future<GoogleSignInAccount> result = _addMethodCall('signInSilently');
if (suppressErrors) {
return result.catchError((dynamic _) => null);
}
return result;
}
Par défaut suppressErrors = true en supprimant les messages d'erreur que vous souhaitez intercepter.
En regardant le code source
La méthode SignInSilently est utilisé pour supprimer les messages d'erreur, évitant ainsi de lever l'exception que vous souhaitez intercepter.
D'après la documentation de cette méthode:
/// When [suppressErrors] is set to `false` and an error occurred during sign in /// returned Future completes with [PlatformException] whose `code` can be /// either [kSignInRequiredError] (when there is no authenticated user) or /// [kSignInFailedError] (when an unknown error occurred).
Méthode complète
try {
result = await GoogleSignIn().signInSilently(suppressErrors: false).catchError((x) {
print(x);
});
} catch (e) {
print(e);
}
Référence
Salut, merci pour votre contribution. Le problème est que l'erreur est lancée et qu'elle n'est tout simplement pas interceptée, alors ma fonction qui encapsule le code signInSilently renvoie un type _TypeError et n'exécute pas le code dans le bloc catch.
Le bloc catchError est en fait atteint si vous utilisez suppressErrors = false
Essayez le code suivant et voyez ce qu'il imprime sur votre console.
result = await GoogleSignIn().signInSilently(suppressErrors: false).
catchError((x) {
print("inside catchError");
});
Merci, cela m'a aidé sur mon chemin car j'ai supprimé la ligne print (e)!
Le problème est la ligne print (e); dans l'instruction catch. «e» n'est pas une chaîne donc une erreur se produit. Je ne sais pas pourquoi mais aucun point d'arrêt n'est atteint dans l'instruction catch pour cette erreur et aucune erreur n'est sortie vers la console. Si je mets une déclaration catch autour d'une fonction qui appelle le code de connexion, c'est-à-dire
try {
result = await GoogleSignIn().signInSilently().catchError((e) {
print(e.toString());
});
} catch (e) {
print(e.toString());
}
Alors j'obtiens un message d'erreur
Unhandled Exception: type '_TypeError' is not a subtype of type 'String'
Donc pour être clair, le code correct serait
void tryLogin(){
try{
myLoginLogic();
} catch(e) {
print(e);
}
}
Pourquoi le code ne casse pas en cas d'erreur et aucun message n'est écrit sur la console pour la fonction d'origine Je ne le fais pas connaître. Ce que je ne comprends pas non plus, c'est pourquoi, même lorsque l'instruction catch est écrite sans erreur, en mode débogage, le code se brise sur la ligne signInSilently () .
p>