2014-11-12 3 views
1

Я задавался вопросом, что-то я создаю StreamController так:Как передать функцию обратного вызова к StreamController

class { 
    StreamController _controller = 
     new StreamController(onListen: _onListen(), onPause: _onPause(), 
      onResume: _onResume(), onCancel: _onCancel()); 

    Stream get stream => _controller.stream; 
} 

в другом классе я призываю

var sub = myInstance.stream.listen(null); 

и я m действительно удивляет, что все обратные вызовы в конструкторе StreamController запускаются.

Есть объяснение для этого поведения?

Cheers!

ответ

3

Вы не должны добавить скобки ()

class { 
    StreamController _controller = 
     new StreamController(onListen: _onListen, onPause: _onPause, 
      onResume: _onResume, onCancel: _onCancel); 

    Stream get stream => _controller.stream; 
} 

Таким образом, выражение вы передаете в качестве аргумента onListen, ... это ссылка на метод/функцию. Когда вы добавляете родителей, выражение является вызовом метода/функции, а фактический аргумент - onListen, , ... является возвращаемым значением выражения.

В качестве альтернативы вы могли бы, чтобы это так (я опустил аргументы, потому что я хочу, чтобы сэкономить время, чтобы lõoke их)

class { 
    StreamController _controller = 
     new StreamController(onListen:() => _onListen(), onPause:() => _onPause(), 
      onResume:() => _onResume(), onCancel:() => _onCancel()); 

    Stream get stream => _controller.stream; 
} 
+1

Ohhhh позор мне ... скажем, это происходит потому, что я учусь Dart .. . Thx в любом случае – BenNG

Смежные вопросы