Google I/O 2018 video Flutterについては、Dartストリームを使用してFlutterアプリケーションの状態を管理する方法について説明しています。スピーカーは、入力ストリームとしてSink
を、出力ストリームとしてStream
を使用することについて話しました。 Sink
とStream
の違いは何ですか?ドキュメントを検索しましたが、あまり感謝していません。
StreamSink
はStreamConsumer
です。つまり、複数のストリーム( addStream
で追加)を取得し、これらのストリームが発行するイベントを処理できます。
StreamSink
のStreamController
である場合、追加されたストリームからのすべてのイベントは、StreamController
によって作成されたストリームによって発行されます。
この方法で、1つ以上のストリームを別のストリームにパイプ(転送)できます。
その点から理解しやすいので、簡単な例で説明しようとします。
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.
ストリームが発行される前に、さまざまなアクションを実行できます。 transform
メソッドは、出力される前に入力データを変換するために使用できる例です。
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
});
これにより、ストリームとシンクの概念がより明確になることを願っています。