无法通过颤振应用程序中的用户 ID 获取特定的用户文档
Posted
技术标签:
【中文标题】无法通过颤振应用程序中的用户 ID 获取特定的用户文档【英文标题】:Not able to fetch particular user document by user id in flutter app 【发布时间】:2020-10-18 13:18:21 【问题描述】:我想通过用户集合中的 id 检索特定用户文档。当我直接传递特定的用户 ID 时,我得到了数据。但是当我使用变量传递它时,它显示为 null。
我的代码如下:
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import '../services/crud.dart';
class test extends StatefulWidget
@override
_testState createState() => _testState();
class _testState extends State<test>
String userID="";
@override
void initState()
super.initState();
///get current user and assign his id
FirebaseAuth.instance.currentUser().then((FirebaseUser user)
setState(()
userID = user.uid;
print(userID);
);
);
@override
Widget build(BuildContext context)
return SingleChildScrollView(
child: Column(
children: <Widget>[
StreamBuilder(
stream: Firestore.instance.collection('users').document(userID).snapshots(),
builder: (context,snapshot)
if (!snapshot.hasData) return const Text("Loading...");
else return Container(
child: Column(
children: <Widget>[
Text(snapshot.data["name"]),
Text(snapshot.data["email"]),
Text(snapshot.data["phone"].toString()),
],
),
);
,
)
],
)
);
当我使用以下代码行并指定 uid 时,它会显示结果:
stream: Firestore.instance.collection('users').document('d6DshRomJMkIe9mAARAi').snapshots(),
但是当我在 document() 中传递 userID 时它不起作用。即使 userID 包含登录用户的实际 id。
stream: Firestore.instance.collection('users').document(userID).snapshots(),
错误说:
NoSuchMethodError: The method '[]' was called on null.
Receiver: null
Tried calling []("name")
This is the structure of my database.
This is the error that I get on my app screen.
【问题讨论】:
嘿彼得,我刚刚添加了数据库的截图。 做一个小测试。用一些 id 初始化 userID,像这样:String userID = 'd6DshRomJMkIe9mAARAi'
并检查它是否适用于 userID。
即使使用一些 id 初始化后问题仍然存在。
我要求进行这个小测试的原因与下面@Peter 的答案相同。在您获得用户 ID 之前执行的查询。但如果即使初始化它也不起作用,这很奇怪。
感谢您的回答 :) @JRamos29。我已经用 Peter'sanswer 更新了我的代码,即使它不工作,但当我提供默认 ID 时它开始工作。
【参考方案1】:
当使用userID
时不起作用,因为currentUser()
是异步的,并且在获取userId
之前就调用了StreamBuilder
,因此请尝试以下操作:
Stream<DocumentSnapshot> getData()async*
FirebaseUser user = await FirebaseAuth.instance.currentUser();
yield* Firestore.instance.collection('users').document(user.uid).snapshots();
创建一个返回 Stream
的方法,然后在 StreamBuilder
内执行以下操作:
children: <Widget>[
StreamBuilder(
stream: getData(),
builder: (context,snapshot)
if (!snapshot.hasData) return const Text("Loading...");
else if(snapshot.hasData)
return Container(
child: Column(
children: <Widget>[
Text(snapshot.data["name"]),
Text(snapshot.data["email"]),
Text(snapshot.data["phone"].toString()),
],
),
);
,
return CircularProgressIndicator();
,
)
],
【讨论】:
在使用 getData() 函数时问题仍然存在。当我直接将 uid 作为“d6DshRomJMkIe9mAARAi”传递时,它开始显示结果。 方法里面可以打印(user.uid) 是的,它正在正确打印用户 ID。 在我的代码中编辑,添加return CircularProgressIndicator();并添加 else if(snapshot.hasData) 非常感谢,彼得·哈达德。实际上问题是uid与auth uid不匹配。我在我的注册代码中更正了。您提供的代码比我使用的要干净得多。再次感谢您:)以上是关于无法通过颤振应用程序中的用户 ID 获取特定的用户文档的主要内容,如果未能解决你的问题,请参考以下文章
如何使用颤振和飞镖从 Cloud Firestore 检索特定数据?