Stream 과의 상호작용에 대한 최신 스냅샷을 기반으로 자체적으로 빌드되는 위젯입니다.
스트림 관리
스트림 은 State.initState , State.didUpdateWidget 또는 State.didChangeDependencies 와 같이 이전에 생성되어야 합니다.StreamBuilder를 생성할 때 State.build 또는 StatelessWidget.build 메서드를 호출하는 동안 생성되어서는 안 됩니다.스트림 이 StreamBuilder 와 동시에 생성되는 경우, StreamBuilder 의 부모가 다시 빌드될 때마다 비동기 작업이 다시 시작됩니다.
일반적인 지침은 모든 메서드가 매 프레임마다 호출될 수 있다고 가정하고 build, 생략된 호출을 최적화로 처리하는 것입니다.
공식 문서 코드
StreamBuilder 는 스트림을 구독해서 새로운 데이터가 들어올 때마다 UI를 자동으로 업데이트하는 위젯이다. (솔직히 공식 문서의 설명과 유튜브 영상만으로는 무슨 위젯인지 감을 못 잡았다..)
더 쉽게 설명하자면 그냥 데이터 바뀌면 알아서 그에 맞춰서 똑같이 데이터 바뀐 거 적용시켜 주는 거라고 할 수 있겠다.
설명만 들어도 겁나 쓸모 있을 것 같은 위젯인데 한번 간단히 알아보자.
하위 속성
속성명 | 타입 | 기본값 | 설명 |
stream | Stream<T> | – | 구독할 스트림 객체 |
builder | AsyncWidgetBuilder<T> | – | 스트림 상태에 따라 위젯을 반환하는 함수 |
initialData | T? | null | 초기 빌드에 사용할 데이터 |
일단 빌더이기 때문에 하위 속성은 핵심적 builder 와 구독할 스트림 객체를 지정할 stream 을 필수로 받고 있다.
위의 코드 예제가 막 간단하지만은 않게 보이는 이유는 이 스트림이 구독하는 객체를 직접 만들어 주느라 그런 것일 것이다.
그런데 이 스트림, 이거 대체 뭘까? 이 스트림이란 간단하게 말해서 이벤트를 전달하는 객체이다. 스트림의 단어적 정의를 생각하면 이해가 편한데 어떠한 흐름, 이라고 생각하면 좋을 것 같다. 모든 흐름을, 모든 이벤트를 전달하는 객체라는 거다.
우리가 평상시 라디오를 듣고 있지 않더라도 주파수에서는 계속 소리를 흘려보내고 있고, 라디오를 켜서 듣기 시작하고, 라디오에서 듣는 채널이 달라질 수도 있고 라디오에서 음악이 다른 것이 나올 수 있고.. 등등 그 모든 것들. 그냥 그런 것들이 스트림인 것이다.
Stream<int> countStream = Stream.periodic(Duration(seconds: 1), (count) => count);
StreamBuilder(
stream: countStream,
builder: (context, snapshot) {
return Text('${snapshot.data}');
},
)
StreamBuilder 는 그러한 스트림을 구독, 주시하여 값이 바뀌거나 어떠한 이벤트가 발생하면 그것을 builder 함수로 위젯을 다시 그려주는 위젯인 것이다.
허나 조금 유의할 점은 우리가 흔히 사용하는 REST API 방식으로는 잘 사용하지 않는다는 점이다.
보통은 (Firebase, WebSocket, 또는 다른 비동기 데이터 소스를 통해 실시간 데이터를 받아와 UI를 업데이트할 때) 이런 때에 사용한다고 한다. 이점 유의하고 도움이 되었길 바라며 마치겠다.