Предоставление BLOC-потоков через поля, методы или геттер

Я использую шаблон BLOC для моего последнего приложения Flutter, и я начал использовать что-то вроде этого для моих выходных потоков:

class MyBloc {
  // Outputs
  final Stream<List<Todo>> todos;

  factory MyBloc(TodosInteractor interactor) {
    final todosController = BehaviorSubject<List<Todo>>()
      ..addStream(interactor.todos);

    return MyBloc._(todosController);
  }

  MyBloc._(this.todos);
}

но постепенно я обнаружил, что делаю что-то более подобное, используя метод (или метод получения) через некоторое время:

class MyBloc {
  final TodosInteractor _interactor;
  // Outputs
  Stream<List<Todo>> todos(){
    return _interactor.todos;
  }

   MyBloc(this._interactor) {  }

}

Для людей, которые хотят видеть... добытчик для todos в TodosInteractor:

  Stream<List<Todo>> get todos {
    return repository
        .todos()
        .map((entities) => entities.map(Todo.fromEntity).toList());
  }

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

1 ответ

Решение

Ну, может быть, это не будет лучшим ответом, но это хорошая практика - показать ваш выходной поток, используя методы get. Ниже приведен пример класса блока, который я написал для проекта с использованием RxDart.

    class CityListWidgetBloc {

      final _cityInput = PublishSubject<List<Cidade>>();
      final _searchInput = new PublishSubject<String>();
      final _selectedItemsInput = new PublishSubject<List<Cidade>>();

      // exposing stream using get methods
      Observable<List<Cidade>> get allCities => _cityInput.stream;
      Observable<List<Cidade>> get selectedItems => _selectedItemsInput.stream;

      List<Cidade> _searchList = new List();
      List<Cidade> _selectedItems = new List();
      List<Cidade> _mainDataList;

      CityListWidgetBloc() {
        //init search stream
        _searchInput.stream.listen((searchPattern) {
          if (searchPattern.isEmpty) {
            _onData(_mainDataList); // resend local data list
          } else {
            _searchList.clear();
            _mainDataList.forEach((city) {
              if (city.nome.toLowerCase().contains(searchPattern.toLowerCase())) {
                _searchList.add(city);
              }
            });

            _cityInput.sink.add(_searchList);
          }
        });
      }
      //getting data from firebase
      getCity( {@required String key}) {
        FirebaseStateCityHelper.getCitiesFrom(key, _onData);
        //_lastKey = key;
      }

      searchFor(String pattern) {
        _searchInput.sink.add(pattern);
      }

      void _onData(List<Cidade> list) {
        _mainDataList = list;
        list.sort((a, b) => (a.nome.compareTo(b.nome)));
        _cityInput.sink.add(list);
      }

      bool isSelected(Cidade item) {
        return _selectedItems.contains(item);
      }

      void selectItem(Cidade item) {
        _selectedItems.add(item);
        _selectedItemsInput.sink.add(_selectedItems);
      }

      void selectItems(List<Cidade> items){
        _selectedItems.addAll( items);
        _selectedItemsInput.sink.add( _selectedItems );
      }

      void removeItem(Cidade item) {
        _selectedItems.remove(item);
        _selectedItemsInput.sink.add(_selectedItems);
      }

      dispose() {
        _cityInput.close();
        _searchInput.close();
        _selectedItemsInput.close();
      }
    }
Другие вопросы по тегам