Flutter - 如何从 Firestore 返回当前用户
Posted
技术标签:
【中文标题】Flutter - 如何从 Firestore 返回当前用户【英文标题】:Flutter - How to return current user from Firestore 【发布时间】:2019-06-12 04:02:13 【问题描述】:尝试从现有 Firestore 用户文档中检索经过身份验证的用户详细信息,我收到以下错误:
在 null 上调用了 getter 'uid'
我的代码如下:
class SideDrawer extends StatelessWidget
const SideDrawer(Key key, this.user) : super(key: key);
final FirebaseUser user;
@override
Widget build(BuildContext context)
return ......
......
userPanel(context),
......
Widget userPanel(BuildContext context)
return new Padding(
padding: const EdgeInsets.only(top: 10.0),
child: new DrawerHeader(
child: StreamBuilder<DocumentSnapshot>(
stream: Firestore.instance
.collection('users')
.document(user.uid)
.snapshots(),
builder:
(BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot)
if (snapshot.hasError)
return Text('Error: $snapshot.error');
else if (snapshot.hasData)
return userName(snapshot.data);
return LinearProgressIndicator();
,
),
),
);
Text userName(DocumentSnapshot snapshot)
if (snapshot.data == null)
return Text('no data set in the user document in firestore');
else
return snapshot.data['name'];
从登录页面发送用户:
void signIn() async
if(_formKey.currentState.validate())
_formKey.currentState.save();
try
FirebaseUser user = await FirebaseAuth.instance.signInWithEmailAndPassword(email: _email, password: _password);
Navigator.push(context, MaterialPageRoute(builder: (context) => HomePage(user: user)));
catch(e)
print(e.message);
这是我的主页:
class HomePage extends StatelessWidget
const HomePage(Key key, this.user) : super(key: key);
final FirebaseUser user;
@override
Widget build(BuildContext context)
return Scaffold(
appBar: AppBar(
title: Text('Home'),
),
drawer: SideDrawer(),
);
猜测这是一个异步编程问题,我对其进行了一些搜索,发现使用“Future”对象的解决方案很少,但无法弄清楚如何以正确的方式实现它,请帮忙?
【问题讨论】:
在此处准确展示您如何设置user
非常重要。它来自哪里?
@DougStevenson 它是 FirebaseUser 的一个实例:请查看“最终 FirebaseUser 用户;”在代码顶部。
是的,您已经声明了一个 FirebaseUser 成员变量,但您从未在您显示的代码中分配它。在您分配之前它将为空。
【参考方案1】:
如果您使用的是Future
,我猜当您调用SideDrawer
时,用户为空,因此您必须先添加验证,然后才能使用“用户”对象。
Widget userPanel(BuildContext context)
return new Padding(
padding: const EdgeInsets.only(top: 10.0),
child: user != null ? DrawerHeader(
child: StreamBuilder<DocumentSnapshot>(
stream: Firestore.instance
.collection('users')
.document(user.uid)
.snapshots(),
builder:
(BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot)
if (snapshot.hasError)
return Text('Error: $snapshot.error');
else if (snapshot.hasData)
return userName(snapshot.data);
return LinearProgressIndicator();
,
),
) : Center(child: CircularProgressIndicator(),)
);
从 HomePage 传递 SideDrawer 小部件上的用户对象
SideDrawer(user: user),
同时修正这一行:
return snapshot.data['name'];
应该是:
return Text(snapshot.data['name']);
【讨论】:
以上是关于Flutter - 如何从 Firestore 返回当前用户的主要内容,如果未能解决你的问题,请参考以下文章
Flutter:Google Maps 如何从 Firestore 设置图标
如何从 Flutter 将文档创建时间戳添加到 Firestore [重复]
如何使用 Flutter 从 Firestore 中的 ListView 获得无限滚动
flutter-firestore:如何从列表视图中删除 n 天前的项目