如何从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