【问题标题】:RxDart - BehaviorSubject/Observable of type VoidRxDart - Void 类型的 BehaviorSubject/Observable
【发布时间】:2019-05-11 12:24:18
【问题描述】:

RxDart 中处理触发转换的操作的最佳方式是什么?

场景:

  • 用户点击按钮后发送请求。
  • 请求列表中的新页面。

RxSwift 等其他响应式实现中,您可以定义类型Observable<Void> 并监听新事件以启动转换。

您可以在 RxDart 中定义一个 Observable,但随后您不得不在主题中添加一些内容,例如 subject.add('something')subject.add(0),这令人困惑。使用subject.add(void)subject.add()subject.add(()) 会很酷,但这是不可能的。

我想到的第一个想法是创建一个新类型,如 Empty 或更具体地为建议的场景 Action

然后我可以这样做:

PublishSubject<Action> action = PublishSubject<Action>();
action.withLatestFrom(...)
    .map(....) // Apply the desired transformations
    ....
    ....;
action.add(Action.create());
action.add(Action.create());

我是在重新发明轮子吗?

有没有更简单的方法来优雅地处理我在这里提出的建议?

【问题讨论】:

  • 是的,你是对的:PublishSubject 是一种跟随方式——只需调用add 方法将你的数据事件发送给注册的监听器
  • 在 Rx.Net 中我们使用 Observable,如果没有其他数据
  • 谢谢@pskink。但是,问题是关于数据类型的。另一部分已经解决了。
  • 使用 void - 按钮不传递任何数据
  • subject.add(null) 但如果你不喜欢这样的 nulls 扩展 PublishSubject&lt;null&gt; 并添加 add() 方法,该方法将简单地调用 this.add(null)

标签: dart flutter system.reactive


【解决方案1】:

您是否尝试过subject.add(Object()) 之类的方法? Objectinstance 是我目前找到的最好的解决方案,我想如果现在没有更好的解决方案,我会继续努力。

例如,为了测试它,你可以这样写:

  test('my subject test', () {
    subject.listen((result) {
      expect(result, isInstanceOf<Object>());
    });
    // myButtonMethodToTestSubject();
  })

我正在构建这个 Github-flutter-notes-rxdart 应用程序以继续在 Flutter 上学习 RxDart,我选择 Object 负责根据需要发送“无效”数据

告诉您是否找到了更好的解决方案来解决您自己的Action 类型。

【讨论】:

  • Object 很好。我认为没有比Action 更具表现力了。你认为创建一个像Action 这样的自己的类型只是为了增加表现力不值得吗?
猜你喜欢
  • 2019-08-04
  • 2020-09-29
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 2021-09-23
  • 2017-01-22
  • 2019-08-06
相关资源
最近更新 更多