如何从firebase Flatter获取用户模型类中的数据
我正在使用如何从firebase Flatter获取用户模型类中的数据,firebase,flutter,dart,google-cloud-firestore,firebase-authentication,Firebase,Flutter,Dart,Google Cloud Firestore,Firebase Authentication,我正在使用Firebase创建应用程序 我的Users.dart文件: class Users{ final String id; final String profileName; final String userName; final String url; final String email; final String bio; Users({ this.id, this.profileName, this.userName,
Firebase
创建应用程序
我的Users.dart
文件:
class Users{
final String id;
final String profileName;
final String userName;
final String url;
final String email;
final String bio;
Users({
this.id,
this.profileName,
this.userName,
this.url,
this.email,
this.bio
});
factory Users.fromDocument(DocumentSnapshot doc){
return Users(
id: doc.data()['id'],
email: doc.data()['email'],
userName: doc.data()['userName'],
url: doc.data()['url'],
profileName: doc.data()['profileName'],
bio: doc.data()['bio']
);
}
}
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart' as auth;
import 'package:mms/models/User.dart';
import 'package:mms/screens/Homepage.dart';
class Auth{
final auth.FirebaseAuth _auth = auth.FirebaseAuth.instance;
final firebaseUser = auth.FirebaseAuth.instance.currentUser;
Users _userFromFirebaseUser(auth.User user){
return user != null ? Users(id: user.uid) : null;
}
Future login(String email, String password) async {
try{
auth.UserCredential result = await _auth.signInWithEmailAndPassword(email: email, password: password);
auth.User user = result.user;
return _userFromFirebaseUser(user);
} catch(e){
print(e.toString());
return null;
}
}
//signup and create user on Firebase
Future register(String name, String email, String password) async {
try{
auth.UserCredential result = await _auth.createUserWithEmailAndPassword(email: email, password: password);
auth.User user = result.user;
return _userFromFirebaseUser(user);
} catch(e){
print(e.toString());
return null;
}
}
//signing out from the app
Future signOut() async {
try{
return await _auth.signOut();
} catch(e){
print(e.toString());
return null;
}
}
}
现在看看Auth.dart
文件:
class Users{
final String id;
final String profileName;
final String userName;
final String url;
final String email;
final String bio;
Users({
this.id,
this.profileName,
this.userName,
this.url,
this.email,
this.bio
});
factory Users.fromDocument(DocumentSnapshot doc){
return Users(
id: doc.data()['id'],
email: doc.data()['email'],
userName: doc.data()['userName'],
url: doc.data()['url'],
profileName: doc.data()['profileName'],
bio: doc.data()['bio']
);
}
}
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart' as auth;
import 'package:mms/models/User.dart';
import 'package:mms/screens/Homepage.dart';
class Auth{
final auth.FirebaseAuth _auth = auth.FirebaseAuth.instance;
final firebaseUser = auth.FirebaseAuth.instance.currentUser;
Users _userFromFirebaseUser(auth.User user){
return user != null ? Users(id: user.uid) : null;
}
Future login(String email, String password) async {
try{
auth.UserCredential result = await _auth.signInWithEmailAndPassword(email: email, password: password);
auth.User user = result.user;
return _userFromFirebaseUser(user);
} catch(e){
print(e.toString());
return null;
}
}
//signup and create user on Firebase
Future register(String name, String email, String password) async {
try{
auth.UserCredential result = await _auth.createUserWithEmailAndPassword(email: email, password: password);
auth.User user = result.user;
return _userFromFirebaseUser(user);
} catch(e){
print(e.toString());
return null;
}
}
//signing out from the app
Future signOut() async {
try{
return await _auth.signOut();
} catch(e){
print(e.toString());
return null;
}
}
}
现在,我正在将用户在我的应用程序上创建帐户时的数据保存到firestore,如下所示:
saveUserInfoToFirestore() async {
var firebaseUser = auth.FirebaseAuth.instance.currentUser;
DocumentSnapshot documentSnapshot =
await firestoreInstance.collection('users').doc(firebaseUser.uid).get();
if (!documentSnapshot.exists) {
//final profileName = await Navigator.push(context, MaterialPageRoute(builder: (context) => SignupPage()));
firestoreInstance.collection("users").doc(firebaseUser.uid).set({
"uid": firebaseUser.uid,
"profileName": _name,
"email": firebaseUser.email,
"timestamp": timestamp,
"bio": ""
}).then((_) => print('Success'));
documentSnapshot = await firestoreInstance
.collection('users')
.doc(firebaseUser.uid)
.get();
}
currentUser = Users.fromDocument(documentSnapshot); //currentUser is the instance of Users model class
}
}
现在,每当我调用users.id
时,我都会收到错误消息
The method '[]' was called on null.
Receiver: null
Tried calling: []("id")
在我的搜索.dart中,我已根据以下内容调用了用户.id
:
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:mms/models/Progress.dart';
import 'package:mms/models/User.dart';
import 'package:mms/screens/ActivityFeed.dart';
import 'package:mms/screens/Homepage.dart';
class SearchPage extends StatefulWidget {
@override
_SearchPageState createState() => _SearchPageState();
}
class _SearchPageState extends State<SearchPage> {
TextEditingController searchTextEditingController = TextEditingController();
Future<QuerySnapshot> futureSearchResults;
String profileName;
void initState(){
super.initState();
getProfileName();
}
clear() {
searchTextEditingController.clear();
}
Future<void> getProfileName() async {
final firestoreInstance = FirebaseFirestore.instance;
firestoreInstance
.collection("users")
.doc(firebaseUser.uid)
.get()
.then((value) {
setState(() {
profileName = value.data()["profileName"].toString();
});
});
}
searchController(String str) {
Future<QuerySnapshot> allUsers = FirebaseFirestore.instance
.collection("users")
.where("profileName", isGreaterThanOrEqualTo: str)
.get();
setState(() {
futureSearchResults = allUsers;
});
}
Container displayNoSearchResultScreen() {
final Orientation orientation = MediaQuery.of(context).orientation;
return Container(
child: Center(
child: ListView(
shrinkWrap: true,
children: <Widget>[
Icon(
Icons.group,
color: Colors.grey,
size: 200.0,
),
Text(
'Find Users',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w500,
fontSize: 50.0),
)
],
),
),
);
}
displayUsersFoundScreen() {
return FutureBuilder(
future: futureSearchResults, builder: (context, dataSnapshot) {
if(!dataSnapshot.hasData){
return circularProgress();
}
//This part is also not working properly
List<UserResult> searchUserResult = [];
dataSnapshot.data.docs.forEach((document){
Users users = Users.fromDocument(document);
UserResult userResult = UserResult(users);
searchUserResult.add(userResult);
});
return ListView(children: searchUserResult,);
});
}
AppBar searchPageHeader() {
return AppBar(
backgroundColor: Colors.black,
title: TextFormField(
style: TextStyle(fontSize: 18.0, color: Colors.white),
controller: searchTextEditingController,
decoration: InputDecoration(
hintText: "Search",
hintStyle: TextStyle(color: Colors.grey),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.grey)),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.white)),
filled: true,
prefixIcon: Icon(
Icons.person_pin,
color: Colors.white,
size: 30.0,
),
suffixIcon: IconButton(
icon: Icon(
Icons.clear,
color: Colors.white,
),
onPressed: clear,
)),
onFieldSubmitted: searchController,
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.black,
appBar: searchPageHeader(),
body: futureSearchResults == null
? displayNoSearchResultScreen()
: displayUsersFoundScreen(),
);
}
}
class UserResult extends StatelessWidget {
final Users users;
UserResult(this.users);
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.all(3.0),
child: Container(
color: Colors.white54,
child: Column(
children: <Widget>[
GestureDetector(
onTap: () => showProfile(context, profileId: users.id),//Here I have called but not working
child: ListTile(
//leading: CircleAvatar(backgroundColor: Colors.blue, backgroundImage: CachedNetworkImageProvider(users.url),),
title: Text(users.profileName, style: TextStyle(
color: Colors.black, fontSize: 16.0, fontWeight: FontWeight.bold,
),),
),
)
],
),
),
);
}
}
import'包:cloud_firestore/cloud_firestore.dart';
进口“包装:颤振/cupertino.dart”;
进口“包装:颤振/材料.省道”;
导入“包:mms/models/Progress.dart”;
导入“包:mms/models/User.dart”;
导入“package:mms/screens/ActivityFeed.dart”;
导入“包:彩信/屏幕/主页.dart”;
类SearchPage扩展StatefulWidget{
@凌驾
_SearchPageState createState()=>\u SearchPageState();
}
类_SearchPageState扩展状态{
TextEditingController搜索TextEditingController=TextEditingController();
未来的搜索结果;
字符串profileName;
void initState(){
super.initState();
getProfileName();
}
清除(){
searchTextEditingController.clear();
}
将来的getProfileName()异步{
最终firestoreInstance=FirebaseFirestore.instance;
firestoreInstance
.收集(“用户”)
.doc(firebaseUser.uid)
.get()
.然后((值){
设置状态(){
profileName=value.data()[“profileName”].toString();
});
});
}
搜索控制器(字符串str){
Future allUsers=FirebaseFirestore.instance
.收集(“用户”)
。其中(“profileName”,大于或等于:str)
.get();
设置状态(){
未来搜索结果=诱惑者;
});
}
容器displayNoSearchResultScreen(){
最终方向=MediaQuery.of(context.Orientation);
返回容器(
儿童:中心(
子:ListView(
收缩膜:对,
儿童:[
图标(
图标组,
颜色:颜色。灰色,
尺寸:200.0,
),
正文(
“查找用户”,
textAlign:textAlign.center,
样式:TextStyle(
颜色:颜色,白色,
fontWeight:fontWeight.w500,
字体大小:50.0),
)
],
),
),
);
}
displayUsersFoundScreen(){
回归未来建设者(
未来:未来搜索结果,生成器:(上下文,数据快照){
如果(!dataSnapshot.hasData){
返回循环进程();
}
//这部分也不能正常工作
列出searchUserResult=[];
dataSnapshot.data.docs.forEach((文档){
用户=用户。来自文档(文档);
UserResult UserResult=UserResult(用户);
searchUserResult.add(userResult);
});
返回ListView(子项:searchUserResult,);
});
}
AppBar searchPageHeader(){
返回AppBar(
背景颜色:Colors.black,
标题:TextFormField(
样式:TextStyle(字体大小:18.0,颜色:Colors.white),
控制器:searchTextEditingController,
装饰:输入装饰(
hintText:“搜索”,
hintStyle:TextStyle(颜色:Colors.grey),
enabledBorder:UnderlineInputBorder(
borderSide:borderSide(颜色:Colors.grey)),
FocusedOrder:下划线输入边框(
borderSide:borderSide(颜色:Colors.white)),
是的,
前缀:图标(
图标。个人密码,
颜色:颜色,白色,
尺寸:30.0,
),
后缀:图标按钮(
图标:图标(
图标。清除,
颜色:颜色,白色,
),
记者:清楚,
)),
onfield已提交:searchController,
),
);
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
背景颜色:Colors.black,
appBar:searchPageHeader(),
正文:futureSearchResults==null
?displayNoSearchResultScreen()
:displayUsersFoundScreen(),
);
}
}
类UserResult扩展了无状态小部件{
最终用户;
UserResult(this.users);
@凌驾
小部件构建(构建上下文){
返回填充(
填充:所有边缘设置(3.0),
子:容器(
颜色:颜色。白色54,
子:列(
儿童:[
手势检测器(
onTap:()=>showProfile(上下文,profileId:users.id),//这里我已经调用了,但没有工作
孩子:ListTile(
//前导:CircleAvatar(backgroundColor:Colors.blue,backgroundImage:CachedNetworkImageProvider(users.url)),
标题:Text(users.profileName,style:TextStyle(
颜色:Colors.black,fontSize:16.0,fontWeight:fontWeight.bold,
),),
),
)
],
),
),
);
}
}
我找不到的错误是什么?如果有人能知道解决方案,请告诉我。我能找到的一个错误是,searchController
中缺少wait
:
Future searchController(字符串str)异步{
QuerySnapshot allUsers=等待FirebaseFirestore.instance
.收集(“用户”)
。其中(“profileName”,大于或等于:str)
.get();
设置状态(){
未来搜索结果=诱惑者;
});
}
这里还有一个等待
问题:
saveUserInfoToFirestore()异步{
var firebaseUser=auth.FirebaseAuth.instance.currentUser;
文档快照文档快照=
等待firestoreInstance.collection('users').doc(firebaseUser.uid.get();
如果(!documentSnapshot.exists){
//final profileName=await Navigator.pu