5
votes

Connexion Google avec Flutter: code d'erreur -4

J'essaie actuellement d'implémenter le package google_sign_in dans Flutter ( https://pub.dartlang.org/packages/ google_sign_in ).

Pour cela, j'ai suivi l'exemple de leur référentiel ( https://github.com/flutter/plugins/blob/master/packages/google_sign_in/lib/google_sign_in.dart ).

Dans cet exemple dans "initState" est un appel signInSilently .

if (errorCode is String && (errorMessage == null || errorMessage is String) && !buffer.hasRemaining)
  throw PlatformException(code: errorCode, message: errorMessage, details: errorDetails);
else
  throw const FormatException('Invalid envelope');

J'ai essayé ce code sous iOS. Sur mon premier App Start, cela a bien fonctionné. Mais depuis que je suis déconnecté, j'obtiens une erreur ici tout le temps que je redémarre mon application. Il s'agit de l'exception PlatformException:

codec.decodeEnvelope(result);

J'ai trouvé dans la question Erreur de connexion Google -4 indiquant que le code d'erreur est dû à une authentification manquante dans le trousseau.

La solution lors de la programmation rapide est d'appeler la méthode * hasAuthInKeychain * avant d'essayer de signInSilently. Mon problème est que la classe GoogleSignIn dans le package flutter n'a pas de fonction nommée comme ceci.

Dois-je exécuter un autre appel avec ce package pour être sûr connexion silencieuse? Ou est-ce que je fais quelque chose de mal pour obtenir ce message ou y a-t-il même la possibilité d'attraper cette erreur?

Edit

J'ai aussi essayé la solution de Marcel. D'une manière ou d'une autre, il n'attrape pas l'exception PlatfromException.

Je ne sais pas si cela aidera: signInSilently () appelle une méthode dans laquelle il y a l'appel suivant (google_sign_in.dart, ligne 217):

await channel.invokeMethod(method)


3 commentaires

HI, veuillez consulter ce numéro github.com/flutter/flutter/issues/15796


Quelle version de google_sign_in est la vôtre? J'ai exactement le même morceau de code fonctionnant sur les deux OS dans une de mes applications sur la version ^ 3.2.4


Je remarque que l'erreur apparaît lorsque l'utilisateur s'est déconnecté auparavant et que cela se produit uniquement dans l'émulateur. Une fois compilé et mis sur un appareil réel, aucune erreur ne s'est produite. CMIIW.


3 Réponses :


1
votes

Vous pouvez simplement vérifier si la connexion a échoué en gérant PlatformException comme ceci:

void _setUpGoogleSignIn() async {
  try {
    final account = await _googleSignIn.signInSilently();
    print("Successfully signed in as ${account.displayName}.");
  } on PlatformException catch (e) {
    // User not signed in yet. Do something appropriate.
    print("The user is not signed in yet. Asking to sign in.");
    _googleSignIn.signIn();
  }
}


2 commentaires

essayé celui-là. Mais d'une manière ou d'une autre, il ne rattrape pas l'erreur. Dans google se connecter est un "wait channel.invokeMethod (méthode). Là, la PlatformException est lancée.


D'accord, j'ai modifié le code en un try-catch explicite. Ça marche?



1
votes

C'est une façon de détecter l'erreur et d'exécuter _googleSignIn.signIn ();

GoogleSignInAccount googleSignInAccount = await googleSignIn
    .signInSilently(suppressErrors: false)
    .catchError((dynamic error) async {
  GoogleSignInAccount googleSignInAccount =
      await _googleSignIn.signIn();
});


0 commentaires

1
votes

Dans mon cas, je ne voulais pas que l'utilisateur voit automatiquement la fenêtre de connexion. Dans ce cas, j'ai changé de signIn à signOut . De cette façon, j'envoie l'utilisateur vers une autre vue avec un message explicatif et un bouton de connexion.

GoogleSignInAccount googleSignInAccount = await googleSignIn
    .signInSilently(suppressErrors: false)
    .catchError((dynamic error) async {
      GoogleSignInAccount googleSignInAccount = await _googleSignIn.signOut();
      return googleSignInAccount;
    });


0 commentaires