Firebase 选择现有帐户时,点击谷歌登录,无休止地加载图标
选择现有帐户时,我会看到无休止的加载图标 我可以第一次创建一个帐户并登录,但当我关闭android studio,然后重新启动main.dart&emulator,然后尝试登录该现有帐户时,我会看到无限加载图标: 这是Firebase 选择现有帐户时,点击谷歌登录,无休止地加载图标,firebase,flutter,android-studio,dart,google-signin,Firebase,Flutter,Android Studio,Dart,Google Signin,选择现有帐户时,我会看到无休止的加载图标 我可以第一次创建一个帐户并登录,但当我关闭android studio,然后重新启动main.dart&emulator,然后尝试登录该现有帐户时,我会看到无限加载图标: 这是loginPage.dart代码:- import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.
loginPage.dart
代码:-
import 'dart:async';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:telegramchatapp/Pages/HomePage.dart';
import 'package:telegramchatapp/Widgets/ProgressWidget.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:shared_preferences/shared_preferences.dart';
class LoginScreen extends StatefulWidget {
LoginScreen({Key key}) : super(key : key);
@override
LoginScreenState createState() => LoginScreenState();
}
class LoginScreenState extends State<LoginScreen> {
final GoogleSignIn googleSignIn = GoogleSignIn();
final FirebaseAuth firebaseAuth = FirebaseAuth.instance;
SharedPreferences preferences;
bool isLoggedIn = false;
bool isLoading = false;
FirebaseUser currentUser;
@override
void initState() {
// TODO: implement initState
super.initState();
isSignedIn();
}
void isSignedIn() async{
this.setState(() {
isLoggedIn = true;
});
preferences = await SharedPreferences.getInstance();
isLoggedIn = await googleSignIn.isSignedIn();
if(isLoggedIn){
Navigator.push(context, MaterialPageRoute(builder: (context) => HomeScreen(currentUserId: preferences.getString("id"))));
}
this.setState(() {
isLoading = false;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topRight,
end: Alignment.bottomLeft,
colors: [Colors.blueAccent, Colors.black12],
),
),
alignment: Alignment.center,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Text(
"Solef App",
style: TextStyle(fontSize: 82.0, color: Colors.white, fontFamily: "Signatra"),
),
GestureDetector(
onTap: controlSignIn,
child: Center(
child: Column(
children: <Widget>[
Container(
width: 270.0,
height: 65.0,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(
"assets/images/google_signin_button.png"),
),
),
),
Padding(
padding: EdgeInsets.all(1.0),
child: isLoading ? circularProgress() : Container(),
),
],
),
),
)
],
),
),
);
}
Future<Null> controlSignIn() async {
preferences = await SharedPreferences.getInstance();
this.setState(() {
isLoading = true;
});
/*GoogleSignIn _googleSignIn = GoogleSignIn(
scopes: [
'email',
'https://www.googleapis.com/auth/contacts.readonly',
],
);*/
GoogleSignInAccount googleUser = await googleSignIn.signIn();
GoogleSignInAuthentication googleAuthentication = await googleUser.authentication;
final AuthCredential credential = GoogleAuthProvider.getCredential(idToken: googleAuthentication.idToken, accessToken: googleAuthentication.accessToken);
FirebaseUser firebaseUser = (await firebaseAuth.signInWithCredential(credential)).user;
//SignIn Success
if(firebaseUser != null){
//check if already signup
final QuerySnapshot resultQuery = await Firestore.instance.collection("users").where("id", isEqualTo: firebaseUser.uid).getDocuments();
final List<DocumentSnapshot> documentSnapshots = resultQuery.documents;
//save data to firestore - if new user
if(documentSnapshots.length == 0){
Firestore.instance.collection("users").document(firebaseUser.uid).setData(
{
"nickname": firebaseUser.displayName,
"photoUrl": firebaseUser.photoUrl,
"id": firebaseUser.uid,
"aboutMe": "I'm using SOLEF chat app.",
"createdAt": DateTime.now().millisecondsSinceEpoch.toString(),
"chatingWith": null,
});
//write data to Local
currentUser = firebaseUser;
await preferences.setString("id", currentUser.uid);
await preferences.setString("nickname", currentUser.displayName);
await preferences.setString("photoUrl", currentUser.photoUrl);
}else{
//write data to Local
currentUser = firebaseUser;
await preferences.setString("id", documentSnapshots[0]["id"]);
await preferences.setString("nickname", documentSnapshots[0]["nickname"]);
await preferences.setString("photoUrl", documentSnapshots[0]["photoUrl"]);
await preferences.setString("aboutMe", documentSnapshots[0]["aboutMe"]);
}
Fluttertoast.showToast(msg: "SignIn Successful.");
this.setState(() {
isLoading = false;
});
Navigator.push(context, MaterialPageRoute(builder: (context) => HomeScreen(currentUserId: firebaseUser.uid)));
}
//SignIn Not Success - Failed
else{
Fluttertoast.showToast(msg: "Try Again, SignIn Failed.");
this.setState(() {
isLoading = false;
});
}
}
}
导入'dart:async';
导入“包:cloud_firestore/cloud_firestore.dart”;
导入“包:firebase_auth/firebase_auth.dart”;
进口“包装:颤振/材料.省道”;
导入“包:app/Pages/HomePage.dart”;
导入“package:app/Widgets/ProgressWidget.dart”;
进口“包装:fluttoast/fluttoast.dart”;
导入“包:google_sign_in/google_sign_in.dart”;
导入“package:shared_preferences/shared_preferences.dart”;
类LoginScreen扩展StatefulWidget{
LoginScreen({Key}):超级(Key:Key);
@凌驾
LoginScreenState createState()=>LoginScreenState();
}
类LoginScreenState扩展了状态{
最终谷歌签名谷歌签名=谷歌签名();
final FirebaseAuth FirebaseAuth=FirebaseAuth.instance;
共享参考偏好;
bool isLoggedIn=false;
bool isLoading=false;
FirebaseUser当前用户;
@凌驾
void initState(){
//TODO:实现initState
super.initState();
isSignedIn();
}
void isSignedIn()异步{
此.setState(){
isLoggedIn=真;
});
preferences=等待SharedReferences.getInstance();
isLoggedIn=等待googleSignIn.isSignedIn();
如果(isLoggedIn){
推送(上下文,MaterialPage路由(生成器:(上下文)=>主屏幕(currentUserId:preferences.getString(“id”)));
}
此.setState(){
isLoading=false;
});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
主体:容器(
装饰:盒子装饰(
梯度:线性梯度(
开始:Alignment.topRight,
结束:对齐。左下角,
颜色:[colors.blueAccent,colors.black12],
),
),
对齐:对齐.center,
子:列(
mainAxisAlignment:mainAxisAlignment.center,
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
正文(
“Solef应用程序”,
样式:TextStyle(fontSize:82.0,颜色:Colors.white,fontFamily:“Signatra”),
),
手势检测器(
onTap:controlSignIn,
儿童:中心(
子:列(
儿童:[
容器(
宽度:270.0,
身高:65.0,
装饰:盒子装饰(
图像:装饰图像(
图片:资产评估(
“资产/图像/谷歌登录按钮.png”),
),
),
),
填充物(
填充:所有边缘设置(1.0),
子项:isLoading?circularProgress():容器(),
),
],
),
),
)
],
),
),
);
}
Future controlSignIn()异步{
preferences=等待SharedReferences.getInstance();
此.setState(){
isLoading=true;
});
/*谷歌签名(
范围:[
“电子邮件”,
'https://www.googleapis.com/auth/contacts.readonly',
],
);*/
GoogleSignInAccount googleUser=等待googleSignIn.signIn();
GoogleSignInAuthentication googleAuthentication=等待googleUser.authentication;
final AuthCredential credential=GoogleAuthProvider.getCredential(idToken:googleAuthentication.idToken,accessToken:googleAuthentication.accessToken);
FirebaseUser FirebaseUser=(等待firebaseAuth.signInWithCredential(credential)).user;
//表示成功
if(firebaseUser!=null){
//检查是否已经注册
final QuerySnapshot resultQuery=wait Firestore.instance.collection(“users”)。其中(“id”,isEqualTo:firebaseUser.uid)。getDocuments();
最终列表文档快照=resultQuery.documents;
//将数据保存到firestore-如果是新用户
如果(documentSnapshots.length==0){
Firestore.instance.collection(“users”).document(firebaseUser.uid).setData(
{
“昵称”:firebaseUser.displayName,
“photoUrl”:firebaseUser.photoUrl,
“id”:firebaseUser.uid,
“aboutMe”:“我正在使用SOLEF聊天应用程序。”,
“createdAt”:DateTime.now().millissecondssinceepoch.toString(),
“chatingWith”:空,
});
//将数据写入本地
currentUser=firebaseUser;
wait preferences.setString(“id”,currentUser.uid);
wait preferences.setString(“昵称”,currentUser.displayName);
wait preferences.setString(“photoUrl”,currentUser.photoUrl);
}否则{
//将数据写入本地
currentUser=firebaseUser;
wait preferences.setString(“id”,documentSnapshots[0][“id]”);
等待首选项。setString(“昵称”,documentSnapshots[0][“昵称”]);
wait preferences.setString(“photoUrl”,documentSnapshots[0][“photoUrl]”);
wait preferences.setString(“aboutMe”,documentSnapshots[0][“aboutMe”]);
}
showtoots(msg:“SignIn Successful.”);
此.setState(){
isLoading=false;
});
推送(上下文,MaterialPage路由(生成器:(上下文)=>主屏幕(currentUserId:firebaseUser.uid));
}
//登录未成功-失败
否则{
showtoots(消息:“重试,登录失败”);
此.setState(){
isLoading=false;
});
}
}
}
这是主页。dart:<
import 'dart:async';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:google_sign_in/google_sign_in.dart';
import '../main.dart';
class HomeScreen extends StatefulWidget {
final String currentUserId;
HomeScreen({Key key, @required this.currentUserId}) : super(key : key);
@override
State createState() => HomeScreenState();
}
class HomeScreenState extends State<HomeScreen> {
@override
Widget build(BuildContext context) {
return RaisedButton.icon(onPressed: logoutUser, icon: Icon(Icons.close), label: Text("Sign Out"));
}
final GoogleSignIn googleSignIn = GoogleSignIn();
Future<Null> logoutUser() async{
await FirebaseAuth.instance.signOut();
await googleSignIn.disconnect();
await googleSignIn.signOut();
Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (context) => MyApp()), (Route<dynamic> route ) => false);
}
}
class UserResult extends StatelessWidget
{
@override
Widget build(BuildContext context) {
}
}