Dart: как я могу отменить подмножество событий в потоке?

#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 будет приятным