登录按钮firebase
我正试图用谷歌从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.
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