使用两个组合流创建 RxCommand
create RxCommand with two combined streams
我有一个包含两个输入的表单:name & address 和一个 save 按钮.
所以我为每个
创建了一个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);
但从未调用流。
有什么提示吗?
是的'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
创建你的按钮激活或停用状态。
我有一个包含两个输入的表单:name & address 和一个 save 按钮.
所以我为每个
创建了一个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);
但从未调用流。
有什么提示吗?
是的'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
创建你的按钮激活或停用状态。