6
votes

La méthode 'signInWithGoogle' n'est pas définie pour la classe 'FirebaseAuth'

J'essaie d'apprendre comment obtenir une application Flutter pour se connecter à Firebase auth. J'ai créé un nouveau projet Flutter à l'aide du plugin android studio et ajouté les dépendances et le code de la page firebase_auth a>.

J'obtiens l'erreur "La méthode 'signInWithGoogle' n'est pas définie pour la classe 'FirebaseAuth'" lorsque j'essaie d'appeler la méthode dans FirebaseAuth.instance (_auth) . Voici le code:

name: flutter_auth
description: Trying out firebase_auth

version: 1.0.0+1

environment:
  sdk: ">=2.0.0-dev.68.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  cupertino_icons: ^0.1.2

  google_sign_in: ^4.0.0
  firebase_auth: ^0.8.0+1

dev_dependencies:
  flutter_test:
    sdk: flutter


flutter:

  uses-material-design: true

Pubspec.yaml:

import 'package:flutter/material.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:firebase_auth/firebase_auth.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  // This widget is the home page of your application. It is stateful, meaning
  // that it has a State object (defined below) that contains fields that affect
  // how it looks.

  // This class is the configuration for the state. It holds the values (in this
  // case the title) provided by the parent (in this case the App widget) and
  // used by the build method of the State. Fields in a Widget subclass are
  // always marked "final".

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  final GoogleSignIn _googleSignIn = GoogleSignIn();
  final FirebaseAuth _auth = FirebaseAuth.instance;

  Future<FirebaseUser> _handleSignIn() async {
    GoogleSignInAccount googleUser = await _googleSignIn.signIn();
    GoogleSignInAuthentication googleAuth = await googleUser.authentication;
    FirebaseUser user = await _auth.signInWithGoogle(
      accessToken: googleAuth.accessToken,
      idToken: googleAuth.idToken,
    );
    print("signed in " + user.displayName);
    return user;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
        actions: <Widget>[      // Add 3 lines from here...
          new IconButton(icon: const Icon(Icons.mic), onPressed: () {
            _handleSignIn()
                .then((FirebaseUser user) => print(user))
                .catchError((e) => print(e));
          })
        ],
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}


1 commentaires

Est-ce que cela répond à votre question? ​​Méthode Flutter Firebase.signInWithGoogle introuvable


5 Réponses :


12
votes

J'ai eu le même problème et j'ai trouvé l'exemple dans le firebase_auth

https://github.com/flutter/plugins/blob/master/packages/firebase_auth/example/lib/main.dart

Essayez de remplacer votre méthode handleSignIn avec

  Future<FirebaseUser> _handleSignIn() async {
    GoogleSignInAccount googleUser = await _googleSignIn.signIn();
    GoogleSignInAuthentication googleAuth = await googleUser.authentication;
    final AuthCredential credential = GoogleAuthProvider.getCredential(
      accessToken: googleAuth.accessToken,
      idToken: googleAuth.idToken,
    );
    final FirebaseUser user = await _auth.signInWithCredential(credential);
    print("signed in " + user.displayName);
    return user;
  }

Il se peut que la méthode signInWithGoogle soit valide mais je n'ai rien trouvé dessus et le code ci-dessus fonctionne pour moi.


6 commentaires

Cela a résolu le problème de compilation. Au moment de l'exécution, je suis en mesure de m'authentifier avec le compte Google, mais maintenant cette méthode lance 'PlatformException (sign_in_failed, com.google.android.gms.common.api.ApiException: 16:, null)'


Cela s'est avéré être un problème de configuration. Problème résolu. Merci, Paul.


@ T.Cervenka quel problème de configuration était-ce et comment l'avez-vous résolu ?? Parce que j'obtiens également la même exception au moment de l'exécution


Désolé, je ne me souviens pas exactement de ce qui n'allait pas. J'ai trouvé tellement de problèmes de configuration pour flutter / firebase_auth que j'ai pris des notes que je serais heureux de vous envoyer si vous m'envoyez un mail à tom@cervenka.org


_auth.signInWithCredential renvoie Future .


Comme l'a dit @Nimish David Mathew, il renvoie le résultat, il pourrait donc être: résultat final = attendre _auth.signInWithCredential (credential); utilisateur final = result.user;



9
votes

Cette implémentation a été à nouveau modifiée, donc maintenant _auth.signInWithCredential renvoie une instance AuthResult, et vous pouvez accéder à l'utilisateur en tant que propriété de cet objet.

Future<FirebaseUser> _handleSignIn() async {
  GoogleSignInAccount googleUser = await _googleSignIn.signIn();
  GoogleSignInAuthentication googleAuth = await googleUser.authentication;
  final AuthCredential credential = GoogleAuthProvider.getCredential(
    accessToken: googleAuth.accessToken,
    idToken: googleAuth.idToken,
  );
  final AuthResult authResult = await _auth.signInWithCredential(credential);
  FirebaseUser user = authResult.user;
  print("signed in " + user.displayName);
  return user;
}


0 commentaires

0
votes

c'est une méthode pour se connecter avec google auth

Future<FirebaseUser> signInWithGoogle() async {
final GoogleSignInAccount googleSignInAccount = await googleSignIn.signIn();
final GoogleSignInAuthentication googleSignInAuthentication =
    await googleSignInAccount.authentication;

final AuthCredential credential = GoogleAuthProvider.getCredential(
  accessToken: googleSignInAuthentication.accessToken,
  idToken: googleSignInAuthentication.idToken,
);

final AuthResult authResult =
    await _firebaseAuth.signInWithCredential(credential);
final FirebaseUser user = authResult.user;

final FirebaseUser currentUser = await _firebaseAuth.currentUser();
if (currentUser != null) {
  final QuerySnapshot result = await Firestore.instance
      .collection('users')
      .where("id", isEqualTo: currentUser.uid)
      .getDocuments();
  final List<DocumentSnapshot> document = result.documents;
  if (document.length == 0) {
    Firestore.instance
        .collection('users')
        .document(currentUser.uid)
        .setData({
      'id': currentUser.uid,
      'username': currentUser.displayName,
      'profilePicture': currentUser.photoUrl
    });
  } else {}
}
return user;

}


0 commentaires

0
votes
import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';

final FirebaseAuth _auth = FirebaseAuth.instance;
final GoogleSignIn googleSignIn = GoogleSignIn();

Future<String> signInWithGoogle() async {
  final GoogleSignInAccount googleSignInAccount = await googleSignIn.signIn();
  final GoogleSignInAuthentication googleSignInAuthentication =
      await googleSignInAccount.authentication;

  final AuthCredential credential = GoogleAuthProvider.getCredential(
    accessToken: googleSignInAuthentication.accessToken,
    idToken: googleSignInAuthentication.idToken,
  );

  final AuthResult authResult = await _auth.signInWithCredential(credential);
  final FirebaseUser user = authResult.user;

  assert(!user.isAnonymous);
  assert(await user.getIdToken() != null);

  final FirebaseUser currentUser = await _auth.currentUser();
  assert(user.uid == currentUser.uid);

  return 'signInWithGoogle succeeded: $user';
}
follow this approach which simple and best in my point view

1 commentaires

Veuillez ajouter des commentaires au code pour l'expliquer. Cela peut aider les futurs visiteurs.



0
votes

Cette réponse a été copiée à partir d'ici: Classe non définie 'FirebaseUser'

À partir de la version firebase_auth 0.18.0 :

Dans la dernière version de firebase_auth , la classe FirebaseUser a été remplacée par User, et la classe AuthResult a été remplacé par UserCredentail . Par conséquent, changez votre code comme suit:

var user = FirebaseAuth.instance.currentUser;
print(user.uid);

FirebaseUser changé en User

AuthResult changé en UserCredential

GoogleAuthProvider.getCredential () changé en GoogleAuthProvider.credential ()

onAuthStateChanged qui notifie les modifications de l'état de connexion de l'utilisateur a été remplacé par authStateChanges()

currentUser ( ) qui est une méthode pour récupérer l'utilisateur actuellement connecté, a été remplacée par la propriété currentUser et elle ne renvoie plus un Future . p>

Exemple des deux méthodes ci-dessus:

FirebaseAuth.instance.authStateChanges().listen((event) {
   print(event.email);
});

Et:

Future<User> currentUser() async {
  final GoogleSignInAccount account = await googleSignIn.signIn();
  final GoogleSignInAuthentication authentication =
      await account.authentication;

  final GoogleAuthCredential credential = GoogleAuthProvider.credential(
      idToken: authentication.idToken,
      accessToken: authentication.accessToken);

  final UserCredential authResult =
      await _auth.signInWithCredential(credential);
  final User user = authResult.user;

  return user;
}


0 commentaires