使用两个组合流创建 RxCommand

create RxCommand with two combined streams

我有一个包含两个输入的表单: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 && _isAddressValidCommand,但无法弄清楚语法。

我创建了一个 ZipStream :

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

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

但从未调用流。

有什么提示吗?

是的'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 为你的按钮的 onTap 处理程序并使用 _saveCommand.canExecute Observable 来提供一个 StreamBuilder 创建你的按钮激活或停用状态。