firebase - 如何将 Firebase 的 Google 登录集成到具有不同编程环境的 Flutter 项目中?
问题描述
我目前的项目有 2 个开发环境,dev 和 production,你可以使用关键字“ fluter flavo r”来了解如何去做。我找到了一种在项目中应用 Facebook auth 的方法,但是对于 Google,这是不可能的。
这是错误发生的顺序
- 按下登录按钮
- 选择一个谷歌帐户登录
- 弹窗选择账号消失,终端出现PlatformException错误
Firebase 谷歌登录
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:flutter/foundation.dart' show kIsWeb;
Future<User?> signInWithGoogle() async {
FirebaseAuth auth = FirebaseAuth.instance;
User? user;
final GoogleSignIn googleSignIn = GoogleSignIn();
final GoogleSignInAccount? googleSignInAccount = await googleSignIn.signIn();
if (googleSignInAccount != null) {
final GoogleSignInAuthentication googleSignInAuthentication =
await googleSignInAccount.authentication;
final AuthCredential credential = GoogleAuthProvider.credential(
accessToken: googleSignInAuthentication.accessToken,
idToken: googleSignInAuthentication.idToken,
);
try {
final UserCredential userCredential =
await auth.signInWithCredential(credential);
user = userCredential.user;
} on FirebaseAuthException catch (e) {
if (e.code == 'account-exists-with-different-credential') {
print("account-exists-with-different-credential");
// handle the error here
} else if (e.code == 'invalid-credential') {
print("invalid-credential");
// handle the error here
}
} catch (e) {
print("another erro ${e}");
// handle the error here
}
}
return user;
}
开发风格的 main.dart
import 'dart:async';
import 'package:com.bnk.myvincom/ui/my_app.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'config/app_config.dart';
import 'constants/strings.dart';
import 'di/components/service_locator.dart';
// import 'firebase_a'
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await setPreferredOrientations();
await setupLocator();
// Initialize Firebase.
await Firebase.initializeApp();
// dev config
AppConfig devAppConfig = AppConfig(appName: Strings.appNameDev, flavor: 'dev');
// This line code just to test if crash server work, it make app crash
// FirebaseCrashlytics.instance.crash();
return runZonedGuarded(() async {
// WidgetsFlutterBinding.ensureInitialized();
runApp(MyApp(devAppConfig));
}, (error, stack) {
print(stack);
print(error);
});
}
Future<void> setPreferredOrientations() {
return SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
DeviceOrientation.landscapeRight,
DeviceOrientation.landscapeLeft,
]);
}
登录页面
import 'package:com.bnk.myvincom/services/firebase_facebook_login_service.dart';
import 'package:com.bnk.myvincom/services/firebass_google_login_service.dart';
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
// import 'package:flutter_';
class FacebookLogin extends StatefulWidget {
@override
_FacebookLoginState createState() => _FacebookLoginState();
}
class _FacebookLoginState extends State<FacebookLogin> {
final _auth = FirebaseAuth.instance;
bool _isLoggedIn = false;
String? _message;
Future _loginWithFacebook() async {
// TODO: handle login
try {
await signInWithFacebook().then((value) => {
print("Facebook ${value}"),
setState(() {
_message = "Logged in as ${value.user!.displayName}";
_isLoggedIn = true;
})
});
} on FirebaseAuthException catch (e) {
print('Facebook failed with error code: ${e.code}');
print(e.message);
}
}
Future _loginWithGoogle() async {
// TODO: handle login
try {
await signInWithGoogle().then((value) => print("Google về ${value}"));
} on FirebaseAuthException catch (e) {
print('Google failed with error code: ${e.code}');
print(e.message);
}
}
Future _logout() async {
// TODO: Handle logout
// SignOut khỏi Firebase Auth
await _auth.signOut();
// Logout facebook
// await _facebooklogin.logOut();
setState(() {
_isLoggedIn = false;
});
}
Future _checkLogin() async {
// TODO: check if user logged in
// Kiểm tra xem user đã đăng nhập hay chưa
final user = await _auth.currentUser;
if (user != null) {
setState(() {
_message = "Logged in as ${user.displayName}";
_isLoggedIn = true;
});
}
}
_buildFacebookLogin() {
return Center(
child: _isLoggedIn
? Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(_message!),
SizedBox(height: 12.0),
OutlineButton(
onPressed: () {
_logout();
},
child: Text('Logout'),
),
],
)
: RaisedButton(
onPressed: () {
_loginWithFacebook();
},
color: Colors.blue,
textColor: Colors.white,
child: Text('Login with Facebook'),
),
);
}
@override
void initState() {
super.initState();
_checkLogin();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
_buildFacebookLogin(),
SizedBox(height: 30),
_buildGoogleLogin(),
],
));
}
_buildGoogleLogin() {
return Center(
child: _isLoggedIn
? Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(_message!),
SizedBox(height: 12.0),
OutlineButton(
onPressed: () {
_logout();
},
child: Text('Logout'),
),
],
)
: RaisedButton(
onPressed: () {
_loginWithGoogle();
},
// color: Colors.blue,
textColor: Colors.red,
child: Text('Login with Google'),
),
);
}
}
解决方案
如果有帮助,你能试试吗
- 卸载应用
- 颤振清洁
- 如果不存在,请在 firebase 控制台中添加 Debug Sha1
- 下载和 google-service.json
- 在设备上运行应用程序
推荐阅读
- flutter - 如何解决这个错误?RenderFlex 子级具有非零弹性,但传入的高度约束是无界的
- angular - 错误 - 在 specStarted 之前调用 addExpectationResult
- flutter - Flutter 集成测试 - 无法停止应用程序 - 仅在 iOS 上
- angular - 清晰角度垂直时间线枚举
- php - 自定义分类模板 | WordPress
- keycloak - Keycloak:跨dc缓存复制
- opengl - OpenGL:从一组已知的高度数据生成视点正确、透视地形山脊线的算法?
- chrome-ux-report - 如何获取 url 级别的每日症结数据?
- python - 如何解决 OSError: [Errno 101] Network is unreachable?
- reactjs - @fullcalendar/react 标题选项作为下拉导航