使用 flutter_login_facebook 0.2.1 使用 Firebase 登录 Flutter Facebook

Flutter Facebook Login with Firebase by using flutter_login_facebook 0.2.1

我是 Flutter 和 Dart 的新手,我正在使用 Google、Apple、FB 和电子邮件和密码构建登录结构。

我在 FB 集成方面遇到了一些问题。我正在使用此依赖项:https://pub.dev/packages/flutter_login_facebook
还要检查他们的 gitHub and better the Medium article.

问题是他们不提供 Firebase 集成,而且我没有足够的经验来涵盖它。
这是他们的代码:

import 'package:flutter/material.dart';
import 'package:flutter_login_facebook/flutter_login_facebook.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  final fb = FacebookLogin();

  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: OutlineButton(
            child: Text('Log In'),
            onPressed: () async {
              final fb = widget.fb;

              // Log in
              final res = await fb.logIn(permissions: [
                FacebookPermission.publicProfile,
                FacebookPermission.email,
              ]);

              // Check result status
              switch (res.status) {
                case FacebookLoginStatus.Success:
                  // Logged in

                  // Send this access token to server for validation and auth
                  final accessToken = res.accessToken;
                  print('Access Token: ${accessToken.token}');

                  // Get profile data
                  final profile = await fb.getUserProfile();
                  print('Hello, ${profile.name}! You ID: ${profile.userId}');

                  // Get email (since we request email permission)
                  final email = await fb.getUserEmail();
                  // But user can decline permission
                  if (email != null) print('And your email is $email');

                  break;
                case FacebookLoginStatus.Cancel:
                  // User cancel log in
                  break;
                case FacebookLoginStatus.Error:
                  // Log in failed
                  print('Error while log in: ${res.error}');
                  break;
              }
            },
          ),
        ),
      ),
    );
  }
}

现在,我想将该代码与我用于 Google 和其他人的 Firebase Auth 集成。
这是我的代码:
wrapper.dart

class Wrapper extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final user = Provider.of<User>(context);

    if (user == null) {
      return Home(); <-- widget with all the logins buttons
    } else {
      return Stores(); <-- widget when they are signed in
    }
  }
}

home.dart*

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  final AuthService _auth = AuthService();
  bool loading = false;
  bool isIos = UniversalPlatform.isIOS;
  bool isAndroid = UniversalPlatform.isAndroid;
  bool isWeb = UniversalPlatform.isWeb;

  final welcomeText = 'Welcome';
  final subtitle = 'Make grocery chores easier';
  final anonymousButtonText = 'Skip';

  @override
  Widget build(BuildContext context) {
    return loading
        ? Loading()
        : Stack(children: [
            AuthLayout(),
            Scaffold(
                backgroundColor: Colors.transparent,
                appBar: AppBar(
                  title: Center(child: Text(welcomeText)),
                  backgroundColor: Colors.transparent,
                ),
                body: SingleChildScrollView(
                    child: ConstrainedBox(
                        constraints: BoxConstraints(),
                        child: Center(
                            child: Column(
                                mainAxisAlignment: MainAxisAlignment.start,
                                children: <Widget>[
                                         
                              // Facebook SignIn
                              <!-- [FB Button should go here, same structure as the Google button below] -->

                              // Google SignIn
                              Padding(
                                  padding: EdgeInsets.all(8.0),
                                  child: new MaterialButton(
                                      onPressed: () async {
                                        setState(() => loading = true);

                                        dynamic result =
                                            await _auth.signInGoogle();

                                        if (result == null) {
                                          setState(() {
                                            loading = false;
                                          });
                                          print(
                                              'error signin in'); // create error page with SnackBar
                                        } else {
                                          print('Signed In Google');
                                          print(result.uid);
                                        }
                                      },
                                      child: SignInGoogleBtn())),

                            ])))))
          ]);
  }
}

authService.dart

class AuthService {
  final FirebaseAuth _auth = FirebaseAuth.instance;
  final GoogleSignIn _googleSignIn = new GoogleSignIn();

  // Create user object based on FirebaseUser
  User _userFromFirebaseUser(FirebaseUser user) {
    return user != null ? User(uid: user.uid) : null;
  }

  // Auth change user stream
  Stream<User> get user {
    return _auth.onAuthStateChanged.map(
        _userFromFirebaseUser);
  }

  // SignIn with Facebook
  // --- HELP HERE --- The structure should be similar to the Google Auth below
  Future signInFacebook() async {}

  
  // SignIn with Google
  Future signInGoogle() async {
    GoogleSignInAccount googleSignInAccount = await _googleSignIn.signIn();

    GoogleSignInAuthentication googleSignInAuthentication =
        await googleSignInAccount.authentication;

    AuthCredential credential = GoogleAuthProvider.getCredential(
        idToken: googleSignInAuthentication.idToken,
        accessToken: googleSignInAuthentication.accessToken);

    try {
      AuthResult result = (await _auth.signInWithCredential(credential));
      FirebaseUser user = result.user;
      return _userFromFirebaseUser(user);
    } catch (e) {
      print(e.toString());
      return null;
    }
  }

  // SignOut
  Future signOut() async {
    try {
      return await _auth.signOut();
    } catch (e) {
      print(e.toString());
      return null;
    }
  }
}

行为应该与 Google btn 相同。当他们点击时,我们通过传统的 FB 身份验证,一旦通过身份验证,它应该回头查看 wrapper.dart 文件,其中 IF 语句将确定 user 是否为空。如果通过身份验证,该语句会将用户重定向到 stores 小部件。

非常感谢任何帮助 乔

更新: 感谢建立这种依赖关系的人(超级明星),我找到了解决问题的方法。

authService.dart

Future signInFacebook() async {
    try {
      final facebookLogin = FacebookLogin();

      // bool isLoggedIn = await facebookLogin.isLoggedIn;

      final FacebookLoginResult result = await facebookLogin.logIn(
        permissions: [
          FacebookPermission.publicProfile,
          FacebookPermission.email,
        ],
      );

      switch (result.status) {
        case FacebookLoginStatus.Success:

          String token = result.accessToken.token;

          final AuthCredential credential =
              FacebookAuthProvider.getCredential(accessToken: token);

          await _auth.signInWithCredential(credential);

          break;
        case FacebookLoginStatus.Cancel:
          break;
        case FacebookLoginStatus.Error:
          print(result.error);
          break;
      }

      return true;
    } catch (error) {
      return false;
    }
  }

home.dart

.....
Padding(
  padding: EdgeInsets.all(8.0),
  child: new MaterialButton(
    onPressed: () async {
      setState(() => loading = true);
      dynamic result = await _auth.signInFacebook();
      if (result == null) {
        setState(() {
          loading = false;
        });
        print('error signin in'); // create error page with SnackBar
      } else {
        print('Signed In Facebook');
      }
    },
    child: signInFacebookBtn()
  )
), .....