使用FirebaseAuth,我正在尝试将google帐户注册到我的应用程序。
在我的主屏幕上,我单击一个ConnectionPage,导航到LoggedInWidget,它在初始使用时将我转到SignUpWidget,然后单击使用google的登录,它弹出弹出式窗口,允许我选择谷歌用户,此时应该将其路由到LoggedInWidget,但是没有发生任何事情(即快照没有数据),我一直得到带有错误日志的SignUpWidget ( 721):输入'Future‘不是’GoogleSignInAccount‘类型在类型转换中的子类型?
在GoogleSignInProvider中有一个转换错误,我无法解决这个错误。有什么帮助吗?
谢谢。
与====相关的属地====
# Google SignIn
firebase_auth: ^3.2.0
google_sign_in: ^5.2.1
# Google Icon
font_awesome_flutter: ^9.2.0代码片段
==== GoogleSignIn Provider ====
//LIBRARIES
//PACKAGES
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:google_sign_in/google_sign_in.dart';
//PAGES
//utilizing Provider dependency
class GoogleSignInProvider extends ChangeNotifier {
//class implements the logic of the google sign in when clicking on google sign in button at the SignUpWidget
final googleSignIn = GoogleSignIn();
GoogleSignInAccount? _user; // the user that has signed in
GoogleSignInAccount get user => _user!;
Future googleLogin() async {
try {
final googleUser = googleSignIn
.signIn(); // user account = account selected in login pop up
// ignore: unnecessary_null_comparison
if (googleUser == null) return;
_user =
googleUser as GoogleSignInAccount?; // saving account in _user field
final googleAuth =
await _user?.authentication; //getting accessToken and IdToken
final credential = GoogleAuthProvider.credential(
accessToken: googleAuth!.accessToken,
idToken: googleAuth.idToken,
);
await FirebaseAuth.instance.signInWithCredential(credential); // use credentials to sign into firebaseAuth
} catch (e) {
print(e.toString());
}
notifyListeners(); // updates the UI
}
Future logout() async {
await googleSignIn.disconnect();
FirebaseAuth.instance.signOut();
}
}====连接页====
//PACKAGES
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
//PAGES
import '../data/vars.dart';
import '../widget/sign_up_widget.dart';
import '../widget/logged_in_widget.dart';
class ConnectionPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: BG_COLOR,
body: StreamBuilder(
stream: FirebaseAuth.instance.authStateChanges(),
builder: (context, snapshot) {
// case: connection is waiting
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(child: LinearProgressIndicator());
}
// case: connection has error
else if (snapshot.hasError) {
return Center(
child: Text(
'Something Went Wrong',
style: Theme.of(context).textTheme.headline1!.copyWith(),
),
);
}
//case: user is logged in already
else if (snapshot.hasData){
return LoggedInWidget();
}
// case: user is not logged in
else {
return SignUpWidget();
//SignUpWidget();
}
}),
);
}
}==== SIGNUPWIDGET ====
//LIBRARIES
//PACKAGES
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart';
//PAGES
import '../data/vars.dart';
import '../provider/google_sign_in.dart';
class SignUpWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
final data = MediaQuery.of(context);
return Scaffold(
appBar: AppBar(backgroundColor: BG_COLOR,),
body: Container(
color: BG_COLOR,
height: data.size.height,
width: data.size.width,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
buildSignUp(context),
],
),
),
);
}
Widget buildSignUp(BuildContext context) =>
ElevatedButton.icon(
onPressed: () {
final provider = Provider.of<GoogleSignInProvider>(context,
listen: false); // implemented in Provider package
provider
.googleLogin(); // user provider to call googleLogin method
},
style: Theme
.of(context)
.elevatedButtonTheme
.style!
.copyWith(),
label: Text('Google Sign In'),
icon: FaIcon(FontAwesomeIcons.google, color: Colors.white70,),
);
}==== LoggedInWidget ====
//LIBRARIES
//import 'dart:js';
//PACKAGES
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
//PAGES
import '../data/vars.dart';
import '../provider/google_sign_in.dart';
class LoggedInWidget extends StatelessWidget {
//final FirebaseAuth firebaseAuth = FirebaseAuth.instance;
@override
Widget build(BuildContext context) {
final data = MediaQuery.of(context);
final user = FirebaseAuth.instance.currentUser!;
return Scaffold(
appBar: AppBar(
title: Text('Logged In'),
centerTitle: true,
actions: [
TextButton(
onPressed: () {
final provider = Provider.of<GoogleSignInProvider>(context, listen:false);
provider.logout();
},
child: Text('Log Out')
)
],
),
body: Container(
height: data.size.height,
width: data.size.width,
padding: EdgeInsets.all(16.0),
decoration: BoxDecoration(
color: BG_COLOR,
border: Border.all(
width: 3.0, color: Colors.grey, style: BorderStyle.solid),
),
alignment: Alignment.center,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Profile',
style: Theme.of(context).textTheme.headline1!.copyWith(),
),
//Display Avatar
SizedBox(
height: 20,
),
CircleAvatar(
radius: 50,
backgroundImage: NetworkImage(user.photoURL!),
),
//Display Name
SizedBox(
height: 8,
),
Text(
'Name: ' + user.displayName!,
style: Theme.of(context).textTheme.caption!.copyWith(),
),
//Display Email
SizedBox(
height: 8,
),
Text(
'Email: ' + user.email!,
style: Theme.of(context).textTheme.caption!.copyWith(),
),
],
),
),
);
}
}发布于 2022-01-09 07:44:14
在这一行中,您丢失了一个await,这就是错误消息的意义所在。改变这一点:
final googleUser = googleSignIn.signIn();对此:
final googleUser = await googleSignIn.signIn();https://stackoverflow.com/questions/70635898
复制相似问题