首页 > 解决方案 > 如何将 Firebase 的 Google 登录集成到具有不同编程环境的 Flutter 项目中?

问题描述

我目前的项目有 2 个开发环境,dev 和 production,你可以使用关键字“ fluter flavo r”来了解如何去做。我找到了一种在项目中应用 Facebook auth 的方法,但是对于 Google,这是不可能的。

这是错误发生的顺序

  1. 按下登录按钮
  2. 选择一个谷歌帐户登录
  3. 弹窗选择账号消失,终端出现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'),
            ),
    );
  }
}

错误日志 在此处输入图像描述

标签: firebaseflutter

解决方案


如果有帮助,你能试试吗

  • 卸载应用
  • 颤振清洁
  • 如果不存在,请在 firebase 控制台中添加 Debug Sha1
  • 下载和 google-service.json
  • 在设备上运行应用程序

推荐阅读