如何在 Dart 中提供 Future<String> 来流式传输需要 String 的流? [复制]

Posted

技术标签:

【中文标题】如何在 Dart 中提供 Future<String> 来流式传输需要 String 的流? [复制]【英文标题】:how can I provide Future<String> to stream that expects String in Dart? [duplicate] 【发布时间】:2021-02-03 13:10:42 【问题描述】:

在我的flutter 应用程序中,我正在构建一个可滚动列表,其中填充了来自 FireBase 的数据。到目前为止,我的代码如下所示:

class FollowersListState extends State<FollowersUsersList> 

  @override
  Widget build(BuildContext context) 


    return StreamBuilder<QuerySnapshot>(
      stream: Firestore.instance.collection('user').where("author", isEqualTo: getUserEmail()).snapshots(),
      builder: (context, snapshot) 
        if (!snapshot.hasData) return CupertinoActivityIndicator();

        return _buildList(context, snapshot.data.docs);
      ,
    );
  

在上面的代码中有这一行:

where("author", isEqualTo: getUserEmail())

getUserEmail() 是一种从本地共享首选项中获取用户电子邮件的方法:

Future<String> getUserEmail() async 
    final prefs = await SharedPreferences.getInstance();
    return prefs.getString('loginEmail');

但是-如您所见-它返回Future&lt;String&gt;而不是String,所以我不能在StreamBuilder&lt;QuerySnapshot&gt;的实现中使用它。在这种情况下,最好的处理方法是什么?

谢谢!

【问题讨论】:

你不能把getUserEmail 放在initState 中吗? @pskink 我不确定如何准确地使用FutureBuilder 来构建流,您能否给我一些提示或显示一些快速示例代码作为这个问题的答案?谢谢! @JohnJoe 你能告诉我一些短代码 sn-p 我该怎么做?我仍然无法将返回的值分配给那里的普通字符串...谢谢! 【参考方案1】:

您不能将Future 解压缩为构建方法中的同步值。您需要将StreamBuilder 包装在FutureBuilder 中,以便提前收到电子邮件:

FutureBuilder(
  future: getUserEmail(),
  builder: (_, emailSnapshot) 
    if (!emailSnapshot.hasData) 
      return CircularProgressIndicator(); // Or something
    
    return StreamBuilder(
      stream: Firestore.instance.collection('user').where("author", isEqualTo: emailSnapshot.data).snapshots(),
      builder: (context, snapshot) 
        if (!snapshot.hasData) return CupertinoActivityIndicator();

        return _buildList(context, snapshot.data.docs);
      ,
    ),
  ,
),

【讨论】:

谢谢你,成功了!

以上是关于如何在 Dart 中提供 Future<String> 来流式传输需要 String 的流? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 dart 中调试时如何访问 Future 值?

Dart:你如何让 Future 等待 Stream?

Future<void> async 与 Dart 中的简单 void async

如何根据您在 Dart 中无法控制的 Stream 返回 Future?

如何将 Future<dynamic> 转换为 dart:flutter 中的字符串

如何在 dart 的 Future 函数中从 JSON 创建一个类对象?