В чем разница между операторами merge и combine в RxDart?

«В чем разница между операторами merge и combine в RxDart?» — вопрос из категории Реактивное программирование, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В RxDart я использовал оба оператора для работы с асинхронными потоками, но они решают разные задачи.

merge объединяет несколько потоков в один, эмитируя события по мере их появления из любого исходного потока. Это похоже на объединение нескольких каналов в один.

// Пример из моего проекта: объединение потоков обновлений UI
final userUpdates = StreamController<int>();
final settingsUpdates = StreamController<int>();

final allUpdates = Rx.merge([
  userUpdates.stream,
  settingsUpdates.stream
]);

allUpdates.listen((data) {
  print('Получено обновление: $data');
  // Может прийти: userData, затем settingsData, затем снова userData
});

combineLatest (чаще называемый просто combine) комбинирует последние значения из всех потоков и эмитит результат только когда все потоки испустили хотя бы одно значение. Я использовал его для синхронизации данных из разных источников.

// Пример: комбинирование данных пользователя и его настроек
final userNameStream = Stream.fromIterable(['Алексей', 'Мария']);
final userAgeStream = Stream.fromIterable([25, 30]);

final userProfile = Rx.combineLatest2(
  userNameStream,
  userAgeStream,
  (String name, int age) => 'Пользователь: $name, возраст: $age'
);

// Результат: 
// "Пользователь: Алексей, возраст: 25"
// "Пользователь: Мария, возраст: 25" (при изменении имени)
// "Пользователь: Мария, возраст: 30" (при изменении возраста)

Практическое различие:

  • merge — для объединения независимых событий (например, клики из разных кнопок)
  • combineLatest — для создания агрегированного состояния из нескольких источников данных (например, форма с несколькими полями)