web-dev-qa-db-fra.com

Quelle est la différence entre Sink et Stream in Flutter?

Google I/O 2018 vidéo sur Flutter explique comment utiliser les flux Dart pour gérer l'état dans une application Flutter. L'orateur a parlé de l'utilisation de Sink comme flux d'entrée et Stream comme flux de sortie. Quelle est la différence entre Sink et Stream? J'ai cherché dans la documentation mais ça ne dit pas trop merci.

12
Toni Joe

Un StreamSink est un StreamConsumer, ce qui signifie qu'il peut prendre plusieurs flux (ajoutés par addStream ) et traite les événements que ces flux émettent.

S'il s'agit du StreamSink d'un StreamController alors tous les événements des flux ajoutés sont émis par le flux créé par le StreamController.

De cette façon, vous pouvez diriger (vers l'avant) un ou plusieurs flux dans un autre.

5

Je vais essayer d'expliquer avec un exemple simple car à partir de là, c'est facile à comprendre.

Sink et Streams font tous deux partie du contrôleur de flux. Vous ajoutez des données au contrôleur de flux à l'aide de sink qui peut être écouté via le stream

Exemple:

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

Usage:

  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.

Vous pouvez effectuer un certain nombre d'actions avant l'émission du flux. La méthode transform est un exemple qui peut être utilisé pour transformer les données d'entrée avant leur émission.

30
Abin

Prenons un exemple simple de SINKS & STREAMS dans Flutter. Veuillez lire les commentaires

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

Maintenant, j'utilise ce LoginBloc dans l'écran de connexion.

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

j'espère que cela rendra votre concept de flux et d'évier plus clair.

1
Divyanshu Kumar