flutter firebase [connect UserID to Profile collection]



我正在学习扑动,遇到了一个问题。我创建了一个小应用程序,可以通过firebase上的Gmail进行身份验证。一旦我登录电子邮件,生成的名称将被添加到";集合:用户";

现在我想在";集合:profilepage";。

在我的main.dart上,我问:用户登录了吗return(UserNameChooser(。

在UserNameChooser中,我有两个文本字段;集合:profilepage";。

现在我的问题是:我如何从";集合:用户";并添加ID到";集合:profilepage";。

或者如何管理profilepage auth连接?

我尝试了很多方法,但都没能完成。。。

我的主要目标

import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:signal/services/auth.dart';
// import 'package:signal/views/home.dart';
import 'package:signal/views/usernamechooser.dart';
import 'views/signin.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
class MyApp extends StatelessWidget {

@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData(

primarySwatch: Colors.lightBlue,
),
home: FutureBuilder(
future: AuthMethods().getCurrentUser(),
builder: (context, AsyncSnapshot<dynamic> snapshot) {
if(snapshot.hasData){
return UserNameChooser();
}
else{
return SignIn();
}
}
),
);
}
}

我的授权镖

import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:signal/helperfunctions/sharedpref_helper.dart';
import 'package:signal/services/database.dart';
import 'package:signal/views/home.dart';
class AuthMethods{
final FirebaseAuth auth = FirebaseAuth.instance;
getCurrentUser() async {
return await auth.currentUser;
}
signInWithGoogle(BuildContext context) async {
final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
final GoogleSignIn _googleSignIn = GoogleSignIn();
final GoogleSignInAccount googleSignInAccount = 
await _googleSignIn.signIn();
final GoogleSignInAuthentication googleSignInAuthentication = await
googleSignInAccount.authentication;
final AuthCredential credential = GoogleAuthProvider.credential(
idToken: googleSignInAuthentication.idToken,
accessToken: googleSignInAuthentication.accessToken
);
UserCredential result = 
await _firebaseAuth.signInWithCredential(credential);

User userDetails = result.user;
if(result != null){
SharedPreferenceHelper().saveUserEmail(userDetails.email);
SharedPreferenceHelper().saveUserId(userDetails.uid);
SharedPreferenceHelper()
.saveUserName(userDetails.email.replaceAll("@gmail.com", ""));
SharedPreferenceHelper().saveDisplayName(userDetails.displayName);
SharedPreferenceHelper().saveUserProfileUrl(userDetails.photoURL);

Map<String, dynamic> userInfoMap = {
"email": userDetails.email,
"username": userDetails.email.replaceAll("@gmail.com", ""),
"name": userDetails.displayName,
"imgUrl": userDetails.photoURL
};

DatabaseMethods()
.addUserInfoToDB(userDetails.uid, userInfoMap)
.then((value) {
Navigator.pushReplacement(
context, MaterialPageRoute(builder: (context) => Home()));
});
}
}
Future signOut() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.clear();
await auth.signOut();
}
}

我的数据库.dart

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:signal/helperfunctions/sharedpref_helper.dart';
class DatabaseMethods{
Future addUserInfoToDB(String userId, Map<String, dynamic>userInfoMap)
async {
return FirebaseFirestore.instance
.collection("users")
.doc(userId)
.set(userInfoMap);
}
Future<Stream<QuerySnapshot>> getUserByUserName(String username) async{
return FirebaseFirestore.instance
.collection("users")
.where("username", isEqualTo: username)
.snapshots();
}

Future addMessage(String chatRoomId, String messageId, Map messageInfoMap) async {
return FirebaseFirestore.instance
.collection ("chatrooms")
.doc(chatRoomId)
.collection("chats")
.doc(messageId)
.set(messageInfoMap);
}
updateLastMessageSend(String chatRoomId, Map lastMessageInfoMap){
return FirebaseFirestore.instance
.collection("chatrooms")
.doc(chatRoomId)
.update(lastMessageInfoMap);
}

createChatRoom(String chatRoomId, Map chatRoomInfoMap) async{
final snapShot = await FirebaseFirestore.instance
.collection("chatrooms")
.doc(chatRoomId)
.get();
if(snapShot.exists){
//chatroom already exists
return true;
}else{
//chatroom does not exists
return FirebaseFirestore.instance
.collection("chatrooms")
.doc(chatRoomId)
.set(chatRoomInfoMap);
}
}
Future<Stream<QuerySnapshot>> getChatRoomMessages(chatRoomId) async {
return FirebaseFirestore.instance
.collection("chatrooms")
.doc(chatRoomId)
.collection("chats")
.orderBy("ts", descending: true)
.snapshots();
}
Future<Stream<QuerySnapshot>> getChatRooms() async {
String myUsername = await SharedPreferenceHelper().getUserName();
return FirebaseFirestore.instance
.collection("chatrooms")
.orderBy("lastMessageSendTs", descending: true)
.where("users",arrayContains: myUsername)
.snapshots();
}
Future<QuerySnapshot> getUserInfo(String username) async {
return await FirebaseFirestore.instance
.collection("users")
.where("username", isEqualTo: username)
.get();
}
}

我的用户名选择器.dart

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:signal/views/home.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:signal/helperfunctions/sharedpref_helper.dart';




Future main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(
MaterialApp(home: UserNameChooser(),));
}
class UserNameChooser extends StatefulWidget{
@override
_UserNameChooserState createState() => _UserNameChooserState();
}
class _UserNameChooserState extends State<UserNameChooser> {
String userNameKey, getUserId;
TextEditingController chosenusername = new TextEditingController();
TextEditingController chosenage = new TextEditingController();


Future<String> getUserName() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getString(userNameKey);
}

@override
Widget build(BuildContext context){
return Scaffold(

appBar: AppBar(title: Text("usernamechooser"),
),
body: Container(

padding: EdgeInsets.all(40.0),
child: Center(child: Column(
children: [
Container(

),
TextFormField(
controller: chosenusername,
decoration: InputDecoration(
hintText: "Username"
),
),
SizedBox(
height: 10.0,
),
TextFormField(
controller: chosenage,
decoration: InputDecoration(
hintText: "alter"
),
),
SizedBox(
height: 10.0,

),



TextButton(
onPressed: (){
Map <String,dynamic> data = {"choseusername": chosenusername.text,"chosenage": chosenage.text};
FirebaseFirestore.instance.collection("userprofile").add(data);


Navigator.push(context, MaterialPageRoute(builder: (context) => Home(),));
},
child: Text("Submit"),
), 

] 

),
)

)

);
}
}

最后但并非最不重要的是我的shared_preferences。dart


import 'package:shared_preferences/shared_preferences.dart';

class SharedPreferenceHelper {
static String userIdKey = "USERKEY";
static String userNameKey = "USERNAMEKEY";
static String displayNameKey = "USERDISPLAYNAMEKEY";
static String userEmailKey = "USEREMAILKEY";
static String userProfilePicKey = "USERPROFILEPICKEY";
//save data
Future<bool> saveUserName(String getUserName) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.setString(userNameKey, getUserName);
}
Future<bool> saveUserEmail(String getUseremail) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.setString(userEmailKey, getUseremail);
}
Future<bool> saveUserId(String getUserId) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.setString(userIdKey, getUserId);
}
Future<bool> saveDisplayName(String getDisplayName) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.setString(displayNameKey, getDisplayName);
}
Future<bool> saveUserProfileUrl(String getUserProfile) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.setString(userProfilePicKey, getUserProfile);
}
// get data
Future<String> getUserName() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getString(userNameKey);
}
Future<String> getUserEmail() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getString(userEmailKey);
}
Future<String> getUserId() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getString(userIdKey);
}
Future<String> getDisplayName() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getString(displayNameKey);
}
Future<String> getUserProfileUrl() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getString(userProfilePicKey);
}
}

问题已解决。。。

我是怎么做到的:

我将currentUser.uid加载到var useruid中。。

var useruid=FirebaseAuth.instance.currentUser.uid;

并将此uid发送给用户数据库:(

最新更新