비동기 데이터 스트림을 관리하는 것은 Flutter 애플리케이션에서 중요한 작업입니다. StreamBuilder
위젯은 실시간 데이터를 처리하고 이러한 비동기 데이터 스트림을 간단하게 처리하고, 새로운 데이터가 스트림에 도착할 때마다 UI를 자동으로 업데이트합니다.
stream
: 스트림을 제공하는 Stream
객체입니다. 스트림의 데이터가 변경될 때마다 빌드 메서드가 호출됩니다.builder
: 스트림에서 새로운 데이터가 수신될 때마다 호출되는 콜백 함수입니다. BuildContext
와 AsyncSnapshot
을 인자로 받습니다.initialData
: 스트림에 데이터가 아직 도착하지 않았을 때 사용할 초기 데이터입니다.Stream
을 통해 상태를 관리하고, StreamBuilder
를 통해 UI를 업데이트할 수 있습니다.스트림은 State.initState
, State.didUpdateWidget
, 또는 State.didChangeDependencies
에서 미리 획득되어야 합니다. State.build
또는 StatelessWidget.build
메서드 호출 시 스트림을 생성하면 안 됩니다. 스트림과 StreamBuilder
를 동시에 생성하면 부모 위젯이 다시 빌드될 때마다 비동기 작업이 재시작됩니다.
일반적인 지침은 모든 빌드 메서드가 매 프레임마다 호출될 수 있다고 가정하고, 생략된 호출을 최적화로 처리하는 것입니다.
위젯 재빌드는 각 상호작용에 의해 State.setState
를 사용하여 예약되지만, 스트림의 타이밍과는 별개로 처리됩니다. 빌더는 Flutter 파이프라인의 재량에 따라 호출되며, 스트림과의 상호작용을 나타내는 스냅샷의 타이밍 종속 하위 시퀀스를 받습니다.
아래 예제는 StreamBuilder
를 사용하여 스트림으로부터 데이터를 받아와서 화면에 표시하는 방법을 보여줍니다.
import 'dart:async';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('StreamBuilder 예제')),
body: Center(
child: DataStreamWidget(),
),
),
);
}
}
class DataStreamWidget extends StatelessWidget {
final Stream<int> _dataStream = (() async* {
for (int i = 0; i < 10; i++) {
await Future.delayed(Duration(seconds: 1));
yield i;
}
})();
Widget build(BuildContext context) {
return StreamBuilder<int>(
stream: _dataStream,
builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator();
} else if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
} else if (!snapshot.hasData) {
return Text('No data');
} else {
return Text('Data: ${snapshot.data}');
}
},
);
}
}
initialData
속성을 사용하여 스트림의 데이터가 아직 도착하지 않았을 때 사용할 기본 데이터를 설정할 수 있습니다.AsyncSnapshot
의 hasError
속성과 error
속성을 사용하여 스트림에서 발생한 에러를 처리할 수 있습니다.AsyncSnapshot
의 connectionState
속성을 사용하여 스트림의 현재 연결 상태를 확인하고, 이에 따라 UI를 다르게 표시할 수 있습니다.StreamBuilder
와 유사한 방식으로 UI를 업데이트합니다.Stream
대신 ValueListenable
을 사용하여 상태 변화를 구독하고 UI를 업데이트할 수 있습니다.