gpt4 book ai didi

firebase - 尽管流返回对象,但 Flutter StreamProvider 仍返回 null

转载 作者:行者123 更新时间:2023-12-03 03:35:56 25 4
gpt4 key购买 nike

我正在尝试设置一个个人资料类型页面,用户可以在其中查看他们的信息,最终我将添加功能,以便他们可以更改他们的数据。我正在使用 Provider 访问 Firebase 流 <User>它返回当前用户的 UID(这工作正常)。然后使用 UID 访问他们的 <UserData>流,但是当我尝试打印时 UserData().email或任何其他数据位,它只返回空值。代码如下:

class Profile extends StatefulWidget {
@override
_ProfileState createState() => _ProfileState();
}

class _ProfileState extends State<Profile> {
@override
Widget build(BuildContext context) {

final user = Provider.of<User>(context);

return StreamProvider<UserData>.value(
initialData: UserData.initialData(),
value: DatabaseService(uid: user.uid).userData,
child: Scaffold(
appBar: AppBar(),
drawer: NavigationDrawer(),
body: ListView(
children: <Widget>[
ListTile(
title: Text(UserData().email),
)
],
),
),
);
}
}

流本身看起来像这样:
  UserData _userDataFromSnapshot(DocumentSnapshot snapshot) {
return UserData(
uid: uid,
email: snapshot.data['email'],
firstName: snapshot.data['firstName'],
lastName: snapshot.data['lastName'],
phone: snapshot.data['phone'],
dateCreated: snapshot.data['dataCreated'],
isVerified: snapshot.data['isVerified']
);
}

//User data stream
Stream<UserData> get userData {
return userDataCollection.document(uid).snapshots()
.map(_userDataFromSnapshot);
}

而 UserData 类就是这个
class UserData {

final String uid;
final String email;
final String firstName;
final String lastName;
final String phone;
final DateTime dateCreated;
final bool isVerified;

UserData({ this.uid, this.email, this.firstName, this.lastName, this.phone, this.dateCreated, this.isVerified });

factory UserData.initialData() {
return UserData(
uid: '',
email: '',
firstName: '',
lastName: '',
phone: '',
dateCreated: null,
isVerified: null,
);
}
}

最后这是我从 ListTile 得到的错误,因为 UserData().email为空,不是字符串:
A non-null String must be provided to a Text widget.
'package:flutter/src/widgets/text.dart':
Failed assertion: line 285 pos 10: 'data != null'

我认为这可能是数据未及时加载的问题,因此当 Flutter 尝试构建页面时,数据不存在,而是添加了 UserData.initialData似乎没有帮助。我已经设法使用 StreamBuilder 让它工作,但是我不知道使用这是最佳实践还是我应该用 Provider 做所有事情,所以任何帮助都将不胜感激。

谢谢

最佳答案

我认为您以错误的方式使用了 StreamProvider。在以下代码中,您将创建一个新的 UserData 对象。

   ListTile(
title: Text(UserData().email),
)

这是一个如何通过创建单独的小部件来使用 StreamProvider 的示例。
class Profile extends StatefulWidget {
@override
_ProfileState createState() => _ProfileState();
}

class _ProfileState extends State<Profile> {
@override
Widget build(BuildContext context) {

return StreamProvider<UserData>.value(
initialData: UserData.initialData(),
value: DatabaseService(uid: user.uid).userData,
child: SecondWidget(),
);
}
}

class SecondWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
final user = Provider.of<UserData>(context);
return Scaffold(
appBar: AppBar(),
drawer: NavigationDrawer(),
body: ListView(
children: <Widget>[
ListTile(
title: Text(user.email),
)
],
),
);
}
}

关于firebase - 尽管流返回对象,但 Flutter StreamProvider 仍返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61173617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com