создать RxCommand с двумя объединенными потоками

У меня есть форма с двумя входными данными: имя и адрес и кнопка сохранить.

Поэтому я создал команды 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);

но поток никогда не вызывается.

Любые подсказки?


person nika.interisti    schedule 15.10.2018    source источник
comment
Обычно люди указывают вам на combineLatestN. На самом деле я обхожу эту проблему вручную, потому что это не сработало для меня, но это было некоторое время назад, и я, возможно, использовал его неправильно.   -  person Jacob Phillips    schedule 15.10.2018


Ответы (1)


Да, мне тоже пришло в голову «combineLatest». что важно с combLatest, так это то, что он не будет выдавать никаких данных, если он не получит что-то во всех входных потоках. Лучше всего достичь этого, если вы добавите .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 для onTaphandler вашей кнопки и использовать _saveCommand.canExecute Observable для подачи StreamBuilder, который создал вашу кнопку в активированном или деактивированном состоянии.

person Thomas    schedule 16.10.2018
comment
ну, я немного упростил код для вопроса. Мне также нужно указать, какое поле недействительно, но я думаю, я могу просто изменить ваш код на: final _isNameAddressValidStream = Observable.combineLatest2<bool, bool, bool>(_isNameValidCommand.startWith(false), _isAddressValidCommand.startWidth(false), (a, b) => a && b); верно? P.S. Спасибо за библиотеку RxCommand :) - person nika.interisti; 16.10.2018
comment
Да, вы можете просто прослушать две команды и отреагировать, если они недействительны. - person Thomas; 16.10.2018