web-dev-qa-db-ja.com

FlutterのSinkとStreamの違いは何ですか?

Google I/O 2018 video Flutterについては、Dartストリームを使用してFlutterアプリケーションの状態を管理する方法について説明しています。スピーカーは、入力ストリームとしてSinkを、出力ストリームとしてStreamを使用することについて話しました。 SinkStreamの違いは何ですか?ドキュメントを検索しましたが、あまり感謝していません。

12
Toni Joe

StreamSinkStreamConsumerです。つまり、複数のストリーム( addStream で追加)を取得し、これらのストリームが発行するイベントを処理できます。

StreamSinkStreamControllerである場合、追加されたストリームからのすべてのイベントは、StreamControllerによって作成されたストリームによって発行されます。

この方法で、1つ以上のストリームを別のストリームにパイプ(転送)できます。

5

その点から理解しやすいので、簡単な例で説明しようとします。

SinkStreamsは両方ともストリームコントローラーの一部です。 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.

ストリームが発行される前に、さまざまなアクションを実行できます。 transformメソッドは、出力される前に入力データを変換するために使用できる例です。

30
Abin

FlutterのSINKS&STREAMSの簡単な例を見てみましょう。コメントを読んでください

       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
});

これにより、ストリームとシンクの概念がより明確になることを願っています。

1
Divyanshu Kumar