如何在 Flutter 的 StreamBuilder 中使用 Future [重复]
Posted
技术标签:
【中文标题】如何在 Flutter 的 StreamBuilder 中使用 Future [重复]【英文标题】:How to use a Future in a StreamBuilder in Flutter [duplicate] 【发布时间】:2020-12-11 13:22:59 【问题描述】:我正在尝试使用 Flutter 和 Firebase 构建我的第一个移动应用程序。
错误: 参数类型“Future Function()”不能分配给参数类型“String”
class ShowUserData extends StatefulWidget
@override
_ShowUserDataState createState() => _ShowUserDataState();
class _ShowUserDataState extends State<ShowUserData>
final email = ()
final userEmail =
FirebaseAuth.instance.currentUser().then((user) => user.email);
print('userEmail + $userEmail');
return userEmail;
;
@override
Widget build(BuildContext context)
return StreamBuilder(
// stream: user.getUserData().asStream(),
stream: Firestore.instance.collection('users').document(email).snapshots(),
builder: (context, snapshot)
if (!snapshot.hasData)
return Text("Loading");
print('snapshot + $snapshot');
var userDocument = snapshot.data;
print('userDocument + $userDocument');
return Text(userDocument['firstName']);
);
【问题讨论】:
我建议您花点时间阅读dart asynchronous programming。它将为您在未来省去很多麻烦。没有双关语 【参考方案1】:对于代码的第一部分,请考虑以下内容:
Future<String> getUserEmail() async
final userEmail =
FirebaseUser user = await FirebaseAuth.instance.currentUser();
String userEmail = user.email;
print('userEmail + $userEmail');
return userEmail;
;
这应该可以解决该错误(因此回答您的问题)。尽管其余代码仍然会失败。你应该阅读futures and async programming。
现在我为整个事情建议的解决方案。 由于您有 2 个不同的异步源来创建流,因此您可能需要考虑创建自己的流! (是的,流就是这样强大的)。
按顺序,你想要
等待未来:.currentUser() 使用结果创建您的 Firestore 快照流试试这样的
class ShowUserData extends StatefulWidget
@override
_ShowUserDataState createState() => _ShowUserDataState();
class _ShowUserDataState extends State<ShowUserData>
Stream currentUserStream() async*
FirebaseUser user = await FirebaseAuth.instance.currentUser();
String userEmail = user.email;
yield* Firestore.instance.collection('users').document(userEmail).snapshots();
;
@override
Widget build(BuildContext context)
return StreamBuilder(
// stream: user.getUserData().asStream(),
stream: currentUserStream(),
builder: (context, snapshot)
if (!snapshot.hasData)
return Text("Loading");
print('snapshot + $snapshot');
var userDocument = snapshot.data;
print('userDocument + $userDocument');
return Text(userDocument['firstName']);
);
【讨论】:
以上是关于如何在 Flutter 的 StreamBuilder 中使用 Future [重复]的主要内容,如果未能解决你的问题,请参考以下文章
在 StreamBuilder 中使用 AnimatedList
Flutter - 如何在不每次下载flutter和dart sdk的情况下切换flutter频道
Flutter-如何在flutter的整个应用程序生命周期中将数据保存在内存中?
Flutter - 如何在 Flutter 应用上实现 News Count