В чем разница между Sink и Stream в Flutter? - PullRequest
0 голосов
/ 15 мая 2018

В Google I / O 2018 video о Flutter объясняется, как использовать потоки Dart для управления состоянием в приложении Flutter. Оратор говорил об использовании Sink в качестве входного потока и Stream в качестве выходного потока. В чем разница между Sink и Stream? Я искал документацию, но это не говорит, большое спасибо.

Ответы [ 3 ]

0 голосов
/ 22 сентября 2018

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

Sink и Streams являются частью контроллера потока.Вы добавляете данные в контроллер потока с помощью sink, которые можно прослушивать с помощью stream

Пример:

  final _user = StreamController<User>();
  Sink get updateUser => _user.sink;
  Stream<User> get user => _user.stream;

Использование:

  updateUser.add(yourUserObject); // This will add data to the stream.
  user.listen((user) => print(user)); // Whenever a data is added to the stream via sink, it will be emitted which can be listened using the listen method.

Youможет выполнить различное количество действий до того, как поток будет выпущен.Метод transform - это пример, который можно использовать для преобразования входных данных перед их отправкой.

0 голосов
/ 19 марта 2019

Давайте рассмотрим простой пример РАКОВИНЫ И ПОТОКА во Флаттере.Пожалуйста, прочитайте комментарии

       class LoginBloc {
          final _repository = Repository();
          final _loginResponse = BehaviorSubject<bool>();  //---->> a simple Sink
          Stream<bool> get isSuccessful => _loginResponse.stream; //-----> Stream linked with above sink

        /*
       *  Below is an async function which uses Repository class
       *  to hit a login API and gets the result in a variable
       *  isUserLoginSuccessful[true/false]. and then Add the result 
       *  into the sink.
       *  now whenever something is added to the sink, a callback is given to
       *  the stream linked to that Sink, which is managed by the framework itself 
       *  
       */

         Future getLoginResponse() async { 
            bool isUserLoginSuccessful = await _repository.processUserLogin();
            _loginResponse.sink.add(isUserLoginSuccessful);
          }

          dispose() {
            _loginResponse.close();
          }
        }

Теперь я использую этот LoginBloc на экране входа в систему.

     class Login extends StatelessWidget {
      final LoginBloc loginBloc;  // ----> Here is the Object of LoginBloc
      Login(this.loginBloc);

      void _onClickLoginButton() async {
        // Hit login API
        // fetch Login API response data
        loginBloc.getLoginResponse(); //------> here is the function we are using in Login
      }

      @override
      Widget build(BuildContext context) {
        return StreamBuilder<bool>(    // ----> You need to use a StreamBuilder Widget on the top Root, or according to the Business logic
          stream: loginBloc.isSuccessful,   // ----> here is the stream which is triggered by Sink which is linked by this stream
          builder: (context, snapshot) {
        // DO WHATEVER YOU WANT AFTER CALLBACK TO STREAM
});

Я надеюсь, что это может сделать вашу концепцию потока и приемника более понятной.

0 голосов
/ 15 мая 2018

A StreamSink - это StreamConsumer, что означает, что он может принимать несколько потоков (добавленных addStream) и обрабатывать события, которые излучают эти потоки.

Если этоStreamSink из StreamController, тогда все события из добавленных потоков отправляются потоком, созданным StreamController.

Таким образом, вы можете направить (переслать) один или несколько потоков в другой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...