登录按钮firebase

登录按钮firebase,firebase,flutter,firebase-authentication,google-signin,Firebase,Flutter,Firebase Authentication,Google Signin,我正试图用谷歌从firebase实现登录按钮,但所有教程都是旧的。我在以下位置出错:onPressed:()=>authService.googleSignIn() 以下是我用于身份验证的代码: import 'package:firebase_auth/firebase_auth.dart'; import 'package:google_sign_in/google_sign_in.dart'; import 'package:cloud_firestore/cloud_firestore.

我正试图用谷歌从firebase实现登录按钮,但所有教程都是旧的。我在以下位置出错:
onPressed:()=>authService.googleSignIn()
以下是我用于身份验证的代码:

import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:rxdart/rxdart.dart';

class AuthService {
   // Dependencies
  final GoogleSignIn _googleSignIn = GoogleSignIn();
  final FirebaseAuth _auth = FirebaseAuth.instance;
  final Firestore _db = Firestore.instance;

  // Shared State for Widgets
  Observable<FirebaseUser> user; // firebase user
  Observable<Map<String, dynamic>> profile; // custom user data in Firestore
  PublishSubject loading = PublishSubject();

  // constructor
AuthService() {
    user = Observable(_auth.onAuthStateChanged);

    profile = user.switchMap((FirebaseUser u) {
      if (u != null) {
        return _db
            .collection('users')
            .document(u.uid)
            .snapshots()
            .map((snap) => snap.data);
      } else {
        return Observable.just({});
      }
    });
  }

  Future<String> _testSignInWithGoogle() async {
    final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
    final GoogleSignInAuthentication googleAuth =
        await googleUser.authentication;
    final AuthCredential credential = GoogleAuthProvider.getCredential(
      accessToken: googleAuth.accessToken,
      idToken: googleAuth.idToken,
    );
    final FirebaseUser user =
          (await _auth.signInWithCredential(credential)).user;
    assert(user.email != null);
    assert(user.displayName != null);
    assert(!user.isAnonymous);
    assert(await user.getIdToken() != null);


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


    return 'signInWithGoogle succeeded: $user';
  }

  Future<String> signOut() async {
    try {
      await _auth.signOut();
      return 'SignOut';
    } catch (e) {
      return e.toString();
    }
  }
}

// TODO refactor global to InheritedWidget
final AuthService authService = AuthService();
import'package:firebase_auth/firebase_auth.dart';
导入“包:google_sign_in/google_sign_in.dart”;
导入“包:cloud_firestore/cloud_firestore.dart”;
导入“包:rxdart/rxdart.dart”;
类身份验证服务{
//依赖关系
最终GoogleSignIn _GoogleSignIn=GoogleSignIn();
final FirebaseAuth _auth=FirebaseAuth.instance;
final Firestore _db=Firestore.instance;
//小部件的共享状态
可观察用户;//firebase用户
可观察的配置文件;//Firestore中的自定义用户数据
PublishSubject加载=PublishSubject();
//建造师
AuthService(){
用户=可观察(_auth.onAuthStateChanged);
profile=user.switchMap((FirebaseUser u){
如果(u!=null){
返回_db
.collection('用户')
.文件(u.uid)
.快照()
.map((快照)=>快照数据);
}否则{
返回可观察的。just({});
}
});
}
Future\u testSignInWithGoogle()异步{
final GoogleSignInAccount googleUser=wait_googleSignIn.signIn();
最终谷歌签名认证=
等待googleUser.authentication;
final AuthCredential credential=GoogleAuthProvider.getCredential(
accessToken:googleAuth.accessToken,
idToken:googleAuth.idToken,
);
最终FirebaseUser用户=
(使用凭证(凭证))等待身份验证登录。用户;
断言(user.email!=null);
断言(user.displayName!=null);
断言(!user.isAnonymous);
断言(wait user.getIdToken()!=null);
final FirebaseUser currentUser=wait_auth.currentUser();
断言(user.uid==currentUser.uid);
返回'signInWithGoogle successed:$user';
}
Future signOut()异步{
试一试{
等待_auth.signOut();
返回“注销”;
}捕获(e){
返回e.toString();
}
}
}
//TODO将全局重构为InheritedWidget
final AuthService AuthService=AuthService();
这是登录页面

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

class LoginScreen extends StatefulWidget {
  @override
  _LoginPageState createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Center(
            child: Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        LoginButton(), // <-- Built with StreamBuilder
        UserProfile()
      ],
    )));
  }
}

class UserProfile extends StatefulWidget {
  @override
  UserProfileState createState() => UserProfileState();
}

class UserProfileState extends State<UserProfile> {
  Map<String, dynamic> _profile;
  bool _loading = false;

  @override
  initState() {
    super.initState();

    // Subscriptions are created here
    authService.profile.listen((state) => setState(() => _profile = state));

    authService.loading.listen((state) => setState(() => _loading = state));
  }

  @override
  Widget build(BuildContext context) {
    return Column(children: <Widget>[
      Container(padding: EdgeInsets.all(20), child: Text(_profile.toString())),
      Text(_loading.toString())
    ]);
  }
}

class LoginButton extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
        stream: authService.user,
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            return MaterialButton(
              onPressed: () => authService.signOut(),
              color: Colors.red,
              textColor: Colors.white,
              child: Text('Signout'),
            );
          } else {
            return MaterialButton(
              onPressed: () => authService.googleSignIn(),
              color: Colors.white,
              textColor: Colors.black,
              child: Text('Login with Google'),
            );
          }
        });
  }
}
导入'dart:async';
进口“包装:颤振/材料.省道”;
导入“包:firebase_auth/firebase_auth.dart”;
导入“auth.dart”;
导入“包:google_sign_in/google_sign_in.dart”;
类LoginScreen扩展StatefulWidget{
@凌驾
_LoginPagentate createState()=>_LoginPagentate();
}
类_loginpagentate扩展状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:中(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
LoginButton(),//UserProfileState();
}
类UserProfileState扩展了状态{
Map_剖面图;
bool\u加载=假;
@凌驾
initState(){
super.initState();
//订阅是在这里创建的
listen((state)=>setState(()=>profile=state));
authService.loading.listen((state)=>setState(()=>loading=state));
}
@凌驾
小部件构建(构建上下文){
返回列(子项:[
容器(padding:EdgeInsets.all(20),child:Text(_profile.toString()),
文本(_loading.toString())
]);
}
}
类LoginButton扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回流生成器(
流:authService.user,
生成器:(上下文,快照){
if(snapshot.hasData){
返回物料按钮(
onPressed:()=>authService.signOut(),
颜色:颜色,红色,
textColor:Colors.white,
子项:文本('Signout'),
);
}否则{
返回物料按钮(
onPressed:()=>authService.googleSignIn(),
颜色:颜色,白色,
textColor:Colors.black,
child:Text('Login with Google'),
);
}
});
}
}

我将
AuthService.googleSignIn()定义为异步方法
因此,无法指定同步方法

onPressed: () => authService.googleSignIn() 
像这样使用

onPressed: () { authService.googleSignIn() }

我将
AuthService.googleSignIn()
设置为异步方法 因此,无法指定同步方法

onPressed: () => authService.googleSignIn() 
像这样使用

onPressed: () { authService.googleSignIn() }

那么错误是什么呢?你必须提到的是
GoogleSignIn()
有一个名为
signIn()
的方法,因此,没有使用
authService.GoogleSignIn()
使用
authService.GoogleSignIn.signIn()
@rkdupr0n,GoogleSignIn仍然有一个错误。我没有完全阅读代码。更改
\u testsignin with google()将onPressed从
onPressed:()=>authService.googleSignIn(),
更改为
onPressed:()=>authService.testSignInWithGoogle(),
这应该可以工作,ig那么错误是什么呢?你必须提到
googleSignIn(),
有一个名为
signIn()的方法
,因此,使用
authService.googleSignIn()
而不是
authService.googleSignIn.signIn()
@rkdupr0n在googleSignIn上仍然会出现错误。我没有完全阅读代码。请将
\u testsignin with google()
更改为
testsignin with google()
,并将onPressed从
更改为onPressed:()=>authService.googleSignIn(),
onPressed:()=>authService.testsignin with google(),
这应该可以用,ig