#flutter #dart #stream #bloc #rxdart
#flutter #dart #поток #блок #rxdart
Вопрос:
В моем приложении flutter я работаю с одним потоком SearchEvent
, который содержит несколько подклассов типов событий ( SearchInputChanged
, PageRequested
, ResultsReceived
). Я использую библиотеку блоков.
Возможно ли это для debounce
подмножества событий? Я хочу отменить SearchInputChanged
события, когда пользователи быстро вводят текст, чтобы избежать инициирования поиска по API, который сразу становится неактуальным.
Ответ №1:
Я смог сделать то, что я хочу, разделив начальный поток, отфильтровав и отменив одно из разделений, а затем объединив их все обратно в один поток. Я не уверен, есть ли какие-либо более чистые или более эффективные подходы.
import 'package:async/async.dart';
import 'package:rxdart/transformers.dart';
// ...
// original inbound events
Stream<SearchEvent> events = ...;
// Split into two streams, one which we will debounce
var splitEvents = StreamSplitter.splitFrom(events, 2);
var inputEvents = splitEvents[0]
// filter to only include events that we want to debounce
.where((event) => event is SearchInputChanged)
.debounceTime(Duration(milliseconds: 250));
// Do reverse of filter above (note the `!` in `is!`)
var otherEvents = splitEvents[1].where((event) => event is! SearchInputChanged);
// This has debounced SearchInputChanged, plus all other events
var finalStream = StreamGroup.merge([inputEvents, otherEvents]);
Комментарии:
1. Нравится ваш ответ!
2. Ответ без пакета rxdart будет приятным