簡體   English   中英

如何讓 Firebase 用戶在 google 登錄功能之外顫抖?

[英]How to make Firebase user in flutter outside the google sign in function?

我制作了一個應用程序,您可以在其中使用 Google 帳戶登錄,並且我想要一個變量來存儲用戶是否登錄並將其上傳到 Firestore。 但是要使用更新數據功能,我需要傳入一個用戶對象,該對象僅在google登錄功能中可用。 那么如何讓谷歌之外的用戶登錄呢?

import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:rxdart/rxdart.dart';

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

  bool loggedIn = false;

  Observable<FirebaseUser> user; //firebase user
  Observable<Map<String, dynamic>> profile; //custom user data in Firestore
  PublishSubject loading = PublishSubject();

  //constructor
  AuthService() {
    user = Observable(_auth.onAuthStateChanged);
    profile = user.switchMap((FirebaseUser u) {
      if (u != null) {
        return _db.collection('users').document(u.uid).snapshots().map((
            snap) => snap.data);
      } else {
        return Observable.just({});
      }
    });
  }


  Future<String> testSignInWithGoogle() async {
    final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
    final GoogleSignInAuthentication googleAuth =
    await googleUser.authentication;
    final AuthCredential credential = GoogleAuthProvider.getCredential(
      accessToken: googleAuth.accessToken,
      idToken: googleAuth.idToken,
    );
    final FirebaseUser user = (await _auth.signInWithCredential(credential))
        .user;
    assert(user.email != null);
    assert(user.displayName != null);
    assert(!user.isAnonymous);
    assert(await user.getIdToken() != null);


    final FirebaseUser currentUser = await _auth.currentUser();
    assert(user.uid == currentUser.uid);

    loggedIn = true;

    updateUserData(user);

    return 'signInWithGoogle succeeded: $user';
  }

  void updateUserData(FirebaseUser user) async {
    DocumentReference ref = _db.collection('users').document(user.uid);

    //loggedIn = true;

    return ref.setData({
      'uid': user.uid,
      'email': user.email,
      'photoURL': user.photoUrl,
      'displayName': user.displayName,
      'lastSeen': DateTime.now(),
      'loggedIn': loggedIn,
    }, merge: true);
  }

  void signOut() {
    _auth.signOut();
    loggedIn = false;
  }
}

final AuthService authService = AuthService();

如果我理解你的問題,你想操縱 Firebase 用戶。 您可以使用多種方法創建 Firebase 用戶,而不僅僅是 GoogleSignIn 的一種。 之后,您可以使用firebase_auth包中的一系列方法更新用戶。

下面是幾個簡單的例子:

FirebaseUser _firebaseUser;
FirebaseAuth _auth = FirebaseAuth.instance;

void registerFirebaseUser(String email, String password){
  _auth.createUserWithEmailAndPassword(
    email: email,
    password: password
  ).then((AuthResult authResult) {
    _firebaseUser = authResult.user;
  });
}

void updateFirebaseUsername(String username) {
  UserUpdateInfo userUpdateInfo = UserUpdateInfo();
  userUpdateInfo.displayName = username;

  _firebaseUser.updateProfile(userUpdateInfo);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM