我有一个带有两个输入的表单:名称和地址和一个保存按钮。
所以我已经为每个创建了 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);
但是从不调用流。
有任何提示吗?
答案 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
停用状态。