Flutter에서 데이터 스트림을 처리하는 데 유용한 위젯 중 하나는 StreamBuilder입니다. StreamBuilder는 스트림을 구독하고 데이터가 변경될 때마다 위젯을 업데이트하는 기능을 제공합니다.
이 글에서는 StreamBuilder를 사용하여 간단한 타이머를 만드는 방법을 소개하고자 합니다.
import 'package:flutter/material.dart';
import 'dart:async';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter StreamBuilder Timer',
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
Stream<int> counterStream() async* {
for (int i = 1; i <= 5; i++) {
await Future.delayed(Duration(seconds: 1));
yield i;
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter StreamBuilder Timer'),
),
body: Center(
child: StreamBuilder<int>(
stream: counterStream(),
builder: (context, snapshot) {
if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
}
switch (snapshot.connectionState) {
case ConnectionState.none:
return Text('No connection');
case ConnectionState.waiting:
return Text('Waiting for data...');
case ConnectionState.active:
return Text('${snapshot.data}');
case ConnectionState.done:
return Text('Timer finished!');
}
},
),
),
);
}
}
코드 설명
- counterStream 함수는 1부터 5까지 숫자를 1초 간격으로 출력하는 Stream을 생성합니다.
- StreamBuilder 위젯은 counterStream을 구독하고 데이터가 변경될 때마다 builder 함수를 실행합니다.
- builder 함수는 Stream에서 받은 데이터를 화면에 표시합니다.
- snapShot은 nullable이므로 null 체크를 반드시 할 수 있도록 합니다.
- snapshot.connectionState는 Stream의 현재 연결 상태를 나타냅니다.
- ConnectionState.none: Stream이 아직 시작되지 않았습니다.
- ConnectionState.waiting: Stream이 데이터를 기다리는 중입니다.
- ConnectionState.active: Stream이 데이터를 활발하게 전송하고 있습니다.
- ConnectionState.done: Stream이 종료되었습니다.
'new' 카테고리의 다른 글
Flutter Stream에서 onData, onDone, onError (0) | 2024.03.18 |
---|---|
Flutter에서 여러 곳에서 Stream을 Listening하는 방법: BroadcastStream 활용 (0) | 2024.03.18 |
StreamController를 이용한 데이터 관찰 예시 (0) | 2024.03.18 |
Dart Stream: 데이터 흐름을 쉽게 처리하는 방법 (0) | 2024.03.18 |
CustomScrollView: 강력한 스크롤 효과 구현 (0) | 2024.03.11 |