【问题标题】:I'm trying to display name on profile user but having errors why?我正在尝试在个人资料用户上显示姓名但出现错误,为什么?
【发布时间】:2021-10-25 01:53:22
【问题描述】:

我关注了一些 tutos 并成功在 firestore 上添加了用户,但是当当前用户正在登录时,我无法在个人资料页面上打印此用户,因为 doc. 在我的后端带有红色下划线,他们说:getter ' doc' 没有为类型 'DocumentSnapshot' 定义。

这是我的整个后端

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

Future<void> userSetup(String displayName) async {
  CollectionReference users = FirebaseFirestore.instance.collection('Users');
  FirebaseAuth auth = FirebaseAuth.instance;
  String uid = auth.currentUser!.uid.toString();
  users.add({'displayName': displayName, 'uid' : uid });
  final result = await users.doc(uid).get();
  return result.doc.data()['displayName'];
}

另外,我的前端也有错误,但我认为这是因为后端错误已初始化或只是编写了代码。

这是我的前端代码: (userId 带有红色下划线,因为它是未定义的,我的 [] 运算符也是),

希望你能帮助我!

 FutureBuilder(
              future: FirebaseFirestore.instance
            .collection('users')
            .doc('uid')
            .get(),
              builder: (context, snapshot) {
                if (snapshot.connectionState == ConnectionState.done) {
                  return Text(snapshot.data['displayName'],
                  );
                } else {
                  return Text("Loading...");

我编辑了

FutureBuilder(
              future: FirebaseFirestore.instance
            .collection('users')
            .doc(FirebaseAuth.instance.currentUser!.uid)
            .get(), 
              builder: (context, snapshot) {
                if (snapshot.hasData)
                  return Text("Loading...");
                if (snapshot.data == null) {
                  print('Document does not exist on the database');
                }else{
                  return Text("Researching data...");
                }
                if (snapshot.connectionState == ConnectionState.done) {
                  var name = snapshot.data as DocumentSnapshot;
                  return Text(name['displayName'],
                  );
                } else {
                  return Text("Loading..");
                }
              },
            )

【问题讨论】:

    标签: firebase flutter google-cloud-firestore backend display


    【解决方案1】:

    您在创建用户时未指定文档 ID,因此为您的用户文档创建了唯一 ID,您无法通过用户 ID 访问文档。您还应该等待创建过程。解决方法很简单,创建用户时指定文档ID即可:

    Future<void> userSetup(String displayName) async {
      CollectionReference users = FirebaseFirestore.instance.collection('Users');
      FirebaseAuth auth = FirebaseAuth.instance;
      String uid = auth.currentUser!.uid.toString();
      await users.doc(uid).set({'displayName': displayName, 'uid': uid });
      final result = await users.doc(uid).get();
      final data = result.data() as Map<String, dynamic>;
      return data['displayName'];
    }
    

    希望它有效!

    【讨论】:

    • 我认为我的代码更好,但我仍然在doc. 遇到错误:没有为类型“DocumentSnapshot”定义 getter 'doc'。尝试导入定义“doc”的库,将名称更正为现有 getter 的名称,或者定义一个名为“doc”的 getter 或字段。
    • 哦,是的,我明白了。它会抛出一个错误,因为你已经有了文档,所以不需要调用 data(),你可以获取你的数据。我将编辑我的答案,希望它现在可以工作”
    • 谢谢,我的后端没有错误了!我也应该编辑我的前端吗?因为我有这个错误:不能无条件地调用方法'[]',因为接收者可以是'null'。尝试使调用有条件(使用'?.')或向目标添加空检查('!')。我尝试了很多事情都没有成功... 我已经更新了我的前端
    • 你到底在哪里遇到了这个错误?在 userSetup 中?在最后一行?前端是什么意思?未来的建设者? (顺便说一句,在未来的构建器中,您的 .doc('uid') 将不起作用,您应该传递真实的用户 ID。
    • 看看我用真实用户数据编辑的代码,一切正常,直到检查快照数据是否为空或存在,它返回给我'数据库上不存在文档'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 2018-08-16
    相关资源
    最近更新 更多