如何在 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<String>
而不是String
,所以我不能在StreamBuilder<QuerySnapshot>
的实现中使用它。在这种情况下,最好的处理方法是什么?
谢谢!
【问题讨论】:
你不能把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 的流? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
Future<void> async 与 Dart 中的简单 void async
如何根据您在 Dart 中无法控制的 Stream 返回 Future?