Flutter_bloc 从没有 UI 事件的 firestore 获取更新的数据

Posted

技术标签:

【中文标题】Flutter_bloc 从没有 UI 事件的 firestore 获取更新的数据【英文标题】:Flutter_bloc get updated data from firestore without UI event 【发布时间】:2019-08-18 13:46:57 【问题描述】:

我正在使用 Flutter 从少数设备交换 Firestore 数据。

如果我使用 StreamBuilder 一切正常,但我不喜欢将业务逻辑与 UI 混合。我更喜欢使用 BLOC 作为模式使用 flutter_bloc 插件。

但是flutter_bloc是这样工作的:

步骤:

    事件 ------------> 新数据但没有新 UI 事件

    异步请求

    异步响应

    State (mapEventToState)-------> ¿我如何获得新的状态?

我没有“UI 事件”,因为 Firestore 数据正在从另一台设备更新,所以我无法更新状态。

我可以在 bloc 构造函数上使用类似的东西:

  Stream<QuerySnapshot> query;
  QuedadaBloc()
    query = Firestore.instance.collection('my_collection').snapshots();
    query.listen((datos)  
      dispatch(Fetch()); // send fictitious UI event
    );
  

但我认为这不是正确的方法。

¿有什么建议吗?

非常感谢。

J。巴勃罗。

【问题讨论】:

您提出的解决方案在我看来基本上没问题。你最关心的是什么? 每次用户触摸 UI 时,您都会得到 2 个答案:一个是 BLOC 答案流,另一个是 FireStore Collection SnapShot。 【参考方案1】:

使用 Flutter、Bloc 和 Firestore 时推荐的方法是让存储库层提供来自 Firestore 的数据流,该数据流可以由 Bloc 构造函数中的 Bloc(或任何其他函数;参见这个example)。

然后,根据流中的更改,当您在流中从 Firestore 接收到新数据时,dispatch 事件。 Bloc 可以处理触发的 dispatch 事件以在 UI 中的更改触发状态更改时以类似的方式更改应用程序的状态。

class SampleBloc extends Bloc<SampleEvent, SampleState> 
  final FirestoreRepo _firestoreRepo;

  StreamSubscription<?> _firestoreStreamSubscription;

  SampleBloc(@required FirestoreData firestoreData)
      : assert(firestoreRepo != null),
        _firestoreRepo = firestoreRepo;

// instead of '_mapXEventToState', the subscription can also be wired in 'SampleBloc' constructor function.  
Stream<TimerState> _mapXEventToState(XEvent xEvent) async* 
    // Runs a dispatch event on every data change in  Firestore 
    _firestoreStreamSubscription = _firestoreRepo.getDataStream().listen(
      (data) 
        dispatch(YEvent(data: data));
      ,
    );
  

参考资料: Comment 1 和 Comment 2,Felix Angelov (felangel),Bloc Gitter Chat 中的flutter_bloc 库创建者

【讨论】:

以上是关于Flutter_bloc 从没有 UI 事件的 firestore 获取更新的数据的主要内容,如果未能解决你的问题,请参考以下文章

从 v7.2.1 迁移到 flutter_bloc v 8.0.0 后不会触发 flutter_bloc 事件

flutter_bloc(在事件处理程序正常完成后调用发出

在使用 flutter_bloc 库调度事件之前等待一些结果

如何使用flutter_bloc处理动画

flutter_bloc 4.0.0如何获取事件属性参数。

从没有 C# 的 F# 学习 .NET