用两个合并的流创建RxCommand

时间:2018-10-15 18:59:05

标签: dart flutter rxdart

我有一个带有两个输入的表单:名称地址和一个保存按钮。

所以我已经为每个创建了 change isValid 命令

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);

但是从不调用流。

有任何提示吗?

1 个答案:

答案 0 :(得分:0)

是的,“ combineLatest”也浮现在我脑海。 CombineLatest重要的是,它不会发布任何数据,除非它在所有输入流上都收到了东西。如果在将.startWith添加到conbineLatest前添加初始值,则最好达到此目的。像

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的onTap处理程序,并使用_saveCommand.canExecute来观察StreamBuilder来提供在激活或激活状态下创建按钮的ChannelId停用状态。