最近学习Flutter,项目针对海外,所以需要google登录和Facebook等三方登录。
今天先来看看 google 登录的实现,网上资料略少,主要是看的官方文档,不得不说,google的官方文档真是详细,还有视频讲解。(google firebase官方示例)
-
第一步 firebase中建立对应项目并开启需要的登录方式
1.首先在firebase的首页点击添加项目,创建一个新的项目
2. 输入项目名称
3. 开启google analytics(分析)默认是开启的,我们本次只讲google登录所以先不开启。点击创建项目
4.等待创建完成,点击android 图标(其他应用点击对应图标)
5.注册应用(填写对应的包名,应用别名,如果需要google登录 需要SHA-1签名指纹(我们就是要用google登录,所以这个必须),获取SHA-1的方法,我放到另外一个文章中《获取签名文件的SHA-1》)。
之后,下载google配置信息(google-services.json)放到对应的文件夹中
按图片放到对应的文件夹中,我们的项目信息google的SDK会直接从这里读取,还是很方便的。如果修改配置,还需要从新下载替换即可。
6.给项目设置登录方式
点击Authentication按钮,之后在右边点击开始
firebase支持多种登录方式,我们用google 登录举例,点击Google按钮
先点右上角启用,之后选择一个电子邮件地址,最后点保存
如果需要添加其他登录方式,点击添加新提供方按钮,添加其他登录方式即可
至此,firebase的准备工作已经完成,下面开始本地工程的配置。
-
第二步 配置flutter 和 android 的依赖库
1.在 android/build.gradle 文件中添加“classpath 'com.google.gms:google-services:4.3.5'
”
dependencies {
classpath 'com.android.tools.build:gradle:4.1.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.google.gms:google-services:4.3.5' // new
}
2.在android/app/build.gradle文件中添加“apply plugin: 'com.google.gms.google-services'
”
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
apply plugin: 'com.google.gms.google-services' // new
3.由于firebaseSDK的方法数过多,需要开启Multidex,所以把minSdkVersion
提高到21以上,在android/app/build.gradle中
defaultConfig {
applicationId "com.example.gtk_flutter"
minSdkVersion 21 // Updated
targetSdkVersion 30
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
4.在Flutter的pubspec.yaml的依赖中增加firebase核心SDK,验证SDK和google登录SDK
dependencies: flutter: sdk: flutter firebase_core: ^1.7.0 firebase_auth: ^3.1.3 google_sign_in: ^5.2.0
点击Pub get,获取SDK
- 第三步 初始化firebase
修改main函数
void main() async { WidgetsFlutterBinding.ensureInitialized();//是绑定widget 框架和Flutter 引擎的桥梁 firebase需要使用到里面的api所以先初始化一下这个 await Firebase.initializeApp();//firebase初始化需要异步。 runApp(const MyApp()); }
之后就可以在需要的地方使用firebase的API了
下面是个使用 google登录的流程例子:
Future<UserCredential> signInWithGoogle() async { FirebaseAuth _auth = FirebaseAuth.instance; final GoogleSignInAccount? googleUser = await GoogleSignIn().signIn(); print("googleUser = ${googleUser.toString()}"); // Obtain the auth details from the request final GoogleSignInAuthentication googleAuth = await googleUser!.authentication; // Create a new credential final OAuthCredential credential = GoogleAuthProvider.credential( accessToken: googleAuth.accessToken, idToken: googleAuth.idToken, ); print("credential = ${credential.toString()}"); final UserCredential authResult = await _auth.signInWithCredential(credential); final User? user = authResult.user; print("user = ${user.toString()}"); return await FirebaseAuth.instance.signInWithCredential(credential); } }