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.
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.
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.
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.