如何在 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

Flutter:如何在 Flutter 中为 Firebase (FCM) 注册令牌订阅ToTopic

Flutter:如何在 google_maps_flutter 中为标记图标设置动画?