3

我有一个包含两个输入的表单:名称地址以及一个保存按钮。

所以我为每个创建了一个更改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);

但从不调用流。

有什么提示吗?

4

1 回答 1

1

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

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用于 ButtononTap处理程序的命令,并使用_saveCommand.canExecuteObservable 来提供一个StreamBuilder在激活或停用状态下创建您的按钮的命令。

于 2018-10-16T08:31:58.013 回答