Flutter 颤振:将FutureBuilder与StreamBuilder一起使用

Flutter 颤振:将FutureBuilder与StreamBuilder一起使用,flutter,stream-builder,flutter-futurebuilder,Flutter,Stream Builder,Flutter Futurebuilder,我有一个屏幕,需要首先从Firestore获取JSON文件名,然后加载资产JSON文件。我通常将StreamBuilder用于Firestore文档快照,并且可以使用FutureBuilder加载JSON。我的问题是如何将它们结合起来?或者,有没有更好的方法来做我提到的事情 据我所知,FutureBuilder无法在StreamBuilder中正常工作,因此我猜这不是一个选择 我从Firestore获取快照,如下所示: UserModel _userDataFromSnapshot(Docu

我有一个屏幕,需要首先从Firestore获取JSON文件名,然后加载资产JSON文件。我通常将StreamBuilder用于Firestore文档快照,并且可以使用FutureBuilder加载JSON。我的问题是如何将它们结合起来?或者,有没有更好的方法来做我提到的事情

据我所知,FutureBuilder无法在StreamBuilder中正常工作,因此我猜这不是一个选择

我从Firestore获取快照,如下所示:

  UserModel _userDataFromSnapshot(DocumentSnapshot snapshot) {
    final userdata = snapshot.data();
    return UserModel(
      ...
    );
  }

  Stream<UserModel> get userData {
    return userCollection.doc(uid).snapshots()
      .map(_userDataFromSnapshot);
  }
UserModel\u userDataFromSnapshot(DocumentSnapshot snapshot){
最终用户数据=snapshot.data();
返回用户模型(
...
);
}
流获取用户数据{
返回userCollection.doc(uid).snapshots()
.map(_userDataFromSnapshot);
}
我将JSON加载为:

FutureBuilder(
  future: DefaultAssetBundle.of(context).loadString(fileName),
  builder: (context, snapshot) {
    if(snapshot.hasData) {
      final data = json.decode(snapshot.data.toString()).cast<String, dynamic>();
      ...
FutureBuilder(
future:DefaultAssetBundle.of(context).loadString(fileName),
生成器:(上下文,快照){
if(snapshot.hasData){
final data=json.decode(snapshot.data.toString()).cast();
...

非常感谢您的帮助或评论。

您可以尝试使用一些状态管理来获取流,然后在从流接收到数据后,获取JSON。 我个人使用的是颤振阵营,但如果你喜欢另一个像Riverpod一样的阵营,这取决于你

如果您在使用Flatter Bloc实现流时遇到困难,以下是一个可以帮助您的中间故事:

集团流程如下所示:

yield*event.map(watchUserData:(watchUserData)异步*{
等待_userdatastreamsubscription?.cancel();
_UserDataStreamSubscription=\u repository.getUserData().listen(
(任一数据)=>
添加(UserDataEvent.userDataReceived(data));
},userDataReceived:(userDataReceived数据)异步*{
收益率数据.data.fold(
(失败)=>
UserDataState.userDataLoadFailure(失败),
(成功){
final jsonData=wait_jsonRepository.loadStringFromFilename(filenam);
UserDataState.userDataLoadSuccess(userData:success,jsonData:jsonData));
}
});

我正在使用Dartz插件中的任意一个来处理存储库中的故障,这就是为什么我在存储库中使用折叠方法。

但即使我使用BLOC模式,我也需要使用StreamBuilder,不是吗?如果是这样,FutureBuilder将无法工作不,你不需要,你只需要一个BlocBuilder。。。。