데이터가 흐르고 이에 반응하여 UI를 갱신하고자 할 때 등등 활용
⇒ 리액티브 프로그래밍
⇒ 데이터 수정 → UI 변경이 자동으로
데이터가 지속적으로 변경되도록 하고 이를 관찰할 수 있다. (비슷한 것 : Rx)
Rx 보다 간단하고 편리하다. RxDart도 있으나 복잡하니 Stream을 써도 충분하다.
var stream = Stream.fromIterable([1, 2, 3]);
기본적으로 스트림은 하나의 리스너만 가질 수 있다. 여러 리스너를 허용하려면 브로드캐스트 스트림으로 변환해야 한다.var stream = Stream.fromIterable([1, 2, 3]).asBroadcastStream();`1
stream.listen((event) => print(event));
import 'dart:async';
class Counter {
final _countStreamController = StreamController<int>()..add(0);
Stream<int> get countStream => _countStreamController.stream;
int _count = 0;
// Stream에서 필요없는 것
int count = 0;
void increment() {
_count++;
_countStreamController.add(_count);
}
}
streamFun() async {
var stream = Stream.fromIterable([4, 5, 6]);
await for (int value in stream) {
print(value);
}
}
Stream을 위젯으로 표현하는 위젯으로 FutureBuilder와 Future 조합과 비슷하다. Future가 단발성이라면 Stream은 지속적으로 변화에 따라 화면을 갱신한다.
StreamBuilder<int> (
initialData: 0,
stream: counter.countStream,
builder: (context, snapshot) {
return Text('$snapshot.data!');
}
),