【问题标题】:create RxCommand with two combined streams使用两个组合流创建 RxCommand
【发布时间】:2019-03-20 06:15:14
【问题描述】:

我有一个包含两个输入的表单:name & address 和一个save 按钮。

所以我为每个命令创建了 changeisValid 命令

final _nameChangedCommand = RxCommand.createSync<String, String>((x) => x);
final _isNameValidCommand = RxCommand.createSync<String, bool>((x) => x != "");

final _addressChangedCommand = RxCommand.createSync<String, String>((x) => x);
final _isAddressValidCommand = RxCommand.createSync<String, bool>((x) => x != "");

我正在尝试为 canSave = _isNameValidCommand &amp;&amp; _isAddressValidCommand 创建相同的保存按钮,但无法弄清楚语法。

我创建了一个 ZipStream :

final _isNameAddressValidStream =
    new StreamZip([_isNameValidCommand, _isAddressValidCommand])
        .map((results) => results.first && results.last)
        .distinct();

final _canSaveCommand =
    RxCommand.createFromStream((_) => _isNameAddressValidStream);

但永远不会调用流。

有什么提示吗?

【问题讨论】:

  • 通常人们会将您指向combineLatestN。实际上,我手动解决了这个问题,因为它对我不起作用,但那是一段时间前的事了,我可能一直用错了。

标签: dart flutter rxdart


【解决方案1】:

是的,我也想到了“combineLatest”。 combineLatest 的重要之处在于它不会发布任何数据,除非它在所有输入流上都收到了某些内容。如果您在将 .startWith 提供给 conbineLatest 之前添加具有初始值的 .startWith,则最好达到此目的。类似的东西

final _isNameAddressValidStream =
    Observable.combineLatest2<String, String, bool>(
        _nameChangedCommand.startWith(''),
        _addressChangedCommand.startWidth(''),
        (name, address) => name != '' && address != '');

final _saveCommand = RxCommand.createSyncNoResult(
    (dataObject) => _saveToWhatever, // your actual save function 
    canExecute: _isNameAddressValidStream);
        .distinct();

因此,您只需要两个命令即可将 _saveCommand 用于您的 Button 的 onTaphandler 并使用 _saveCommand.canExecute Observable 来提供 StreamBuilder,该 StreamBuilder 使您的按钮处于激活或停用状态。

【讨论】:

  • 好吧,我已经简化了问题的代码。我还需要指出哪个字段无效,但我想我可以简单地将您的代码修改为:final _isNameAddressValidStream = Observable.combineLatest2&lt;bool, bool, bool&gt;(_isNameValidCommand.startWith(false), _isAddressValidCommand.startWidth(false), (a, b) =&gt; a &amp;&amp; b); 对吗?附言感谢 RxCommand 库:)
  • 是的,你可以或者只听这两个命令,如果它们无效就做出反应
猜你喜欢
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 2016-08-08
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多