Dart Flutter: зачем использовать геттер вместо сеттера для Stream Sink?

В моем базовом понимании Stream и sink мы добавляем данные в приемник, чтобы передать их через поток, но чтобы добавить его, мы используем геттер вместо сеттера, который я считаю нелогичным (см. Пример ниже), не могли бы вы объяснить в простыми словами почему так, а не наоборот?

Пример:

class BlogPostViewModel {
  StreamController<List<BlogPost>> _blogPostListController = StreamController.broadcast();
  Stream<List<BlogPost>> get outBlogPostList => _blogPostListController.stream;
  Sink<List<BlogPost>> get _inBlogPostList => _blogPostListController.sink; // Here why use get and not a setter?
}

Заранее спасибо.


person Mehdi Rezzag Hebla    schedule 19.07.2020    source источник
comment
Ты мог бы. Нет реальной причины не делать этого.   -  person Rémi Rousselet    schedule 19.07.2020
comment
@ RémiRousselet, не могли бы вы объяснить поподробнее?   -  person Mehdi Rezzag Hebla    schedule 19.07.2020
comment
Нет никаких реальных недостатков в использовании set foo(int value) => _sink.add(value) вместо Sink<int> get foo => _sink. Единственная разница в том, что у вас нет доступа к Sink.close, но это не имеет особого значения.   -  person Rémi Rousselet    schedule 19.07.2020


Ответы (1)


Концепция getter и setter - это способ имитировать доступ к полю в классе, но контролировать его поведение. Так что за кулисами не может быть никакой переменной, если мы хотим, например. есть геттер, который каждый раз откуда-то извлекает данные (пожалуйста, не делайте этого).

Поэтому get и set - это методы, вызываемые, когда мы пытаемся получить и установить значение этого поля:

class MyClass {
  void get test => print('You called get');
  set test(void input) => print('You called set');
}

void main() {
  final obj = MyClass();
  obj.test;         // You called get
  obj.test = null;  // You called set
}

Итак, в вашем случае вы хотите сделать так, чтобы при попытке получить переменную с именем _inBlogPostList вместо этого вы получили результат _blogPostListController.sink.

Преимущество этого заключается в том, что вы получаете Sink экземпляр, который можно вызывать add и close. Если вам не нужно close раковину, вы можете вместо этого использовать метод set, чтобы добавить что-то в раковину, как предлагает Реми Русселе.

person julemand101    schedule 19.07.2020
comment
Очень признателен! - person Mehdi Rezzag Hebla; 19.07.2020