Как я могу создать новый поток из других потоков, возвращающий список всех испускаемых значений (шаблон блока)?

У меня есть три таких потока:

  final _light1RoomCtlr = BehaviorSubject<String>();
  final _light2RoomCtlr = BehaviorSubject<String>();
  final _light3RoomCtlr = BehaviorSubject<String>();
  Stream<String> get getLight1Room => _light1RoomCtlr.stream;
  Function(String) get setLight1Room => _light1RoomCtlr.sink.add;
  Stream<String> get getLight2Room => _light2RoomCtlr.stream;
  Function(String) get setLight2Room => _light2RoomCtlr.sink.add;
  Stream<String> get getLight3Room => _light3RoomCtlr.stream;
  Function(String) get setLight3Room => _light3RoomCtlr.sink.add;

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

Дело в том, что я использую шаблон блока, и у меня нет на нем функции initState (), поэтому я не могу инициализировать материал ... так что дротик не позволит мне сделать что-то подобное с тем же файлом:

 final List<String> _lightRooms = List<String>();
  Observable.merge([getLight1Room, getLight2Room, getLight3Room]).listen((room) =>
    _lightRooms.add(room);
  ));

Я много чего пробовал и все время получаю сообщение об ошибке: инициализируются только статические члены ... или что-то в этом роде ... Как я могу выполнить это, используя реактивное программирование и шаблон блока? Если я буду прослушивать виджет, который мне нужен, я могу потерять информацию о другом. Я пробовал примеры rxjs, но здесь это не работает, так как это только вещи определения класса.


person Daniel Vilela    schedule 02.05.2019    source источник


Ответы (1)


Вы можете комбинироватьLatest2, CombineLatest4, CombineLatest5 и т. Д.

Например:

import 'dart:async';

import 'package:login_bloc/src/blocs/validators.dart';
import 'package:rxdart/rxdart.dart';

class Bloc with Validators {
  final _email = BehaviorSubject<String>();
  final _password = BehaviorSubject<String>();

  Stream<String> get email => _email.stream.transform(validateEmail);
  Stream<String> get password => _password.stream.transform(validatePassword);
  Stream<bool> get submitValid =>
      Observable.combineLatest2(email, password, (e, p) => true);

  Function(String) get changeEmail => _email.sink.add;
  Function(String) get changePassword => _password.sink.add;

  submit() {
    final validEmail = _email.value;
    final validPassword = _password.value;

    print('valid data:');
    print(validEmail);
    print(validPassword);
  }

  dispose() {
    _email.close();
    _password.close();
  }
}
person Stellar Creed    schedule 02.05.2019
comment
@ Даниэль Вилела, это помогает? - person Stellar Creed; 08.05.2019