【问题标题】:How to use a Future in a StreamBuilder in Flutter [duplicate]如何在 Flutter 的 StreamBuilder 中使用 Future [重复]
【发布时间】: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']);
             });
       }
     }
    

【问题讨论】:

标签: string flutter google-cloud-firestore future stream-builder


【解决方案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']);
         });
   }
 }

【讨论】:

    猜你喜欢
    • 2021-07-03
    • 2021-11-11
    • 1970-01-01
    • 2022-12-25
    • 1970-01-01
    • 2019-11-29
    • 2021-05-17
    • 2021-02-21
    • 2021-07-07
    相关资源
    最近更新 更多