在 Flutter 中,Stream
是一种用于处理异步数据流的工具,它允许你监听和响应来自数据源的事件。Stream
特别适用于处理实时数据,如网络请求、传感器数据、用户输入等。
基本概念
- Stream: 一个数据流,可以发出多个事件(数据项、错误、完成信号)。
- StreamController: 用于创建和管理
Stream
的对象,可以手动添加事件到 Stream
中。
- StreamSubscription: 用于监听
Stream
的事件,可以取消监听。
创建和使用 Stream
-
创建 StreamController:
final StreamController<int> controller = StreamController<int>();
-
添加事件到 Stream:
controller.sink.add(1);
controller.sink.add(2);
controller.sink.add(3);
-
监听 Stream:
final subscription = controller.stream.listen(
(data) {
print('Data: $data');
},
onError: (error) {
print('Error: $error');
},
onDone: () {
print('Stream closed');
},
);
-
关闭 StreamController:
controller.close();
使用 StreamBuilder
StreamBuilder
是 Flutter 中用于构建 UI 的组件,它会根据 Stream
中的数据变化自动重建 UI。
StreamBuilder<int>(
stream: controller.stream,
builder: (context, snapshot) {
if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
}
if (!snapshot.hasData) {
return CircularProgressIndicator();
}
return Text('Data: ${snapshot.data}');
},
);
示例:实时计数器
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
final StreamController<int> controller = StreamController<int>();
int counter = 0;
MyApp() {
Future.delayed(Duration(seconds: 1), () {
controller.sink.add(counter++);
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Stream Example')),
body: Center(
child: StreamBuilder<int>(
stream: controller.stream,
builder: (context, snapshot) {
if (snapshot.hasData) {
return Text('Counter: ${snapshot.data}');
} else {
return CircularProgressIndicator();
}
},
),
),
),
);
}
@override
void dispose() {
controller.close();
super.dispose();
}
}
总结
Stream
是 Flutter 中处理异步数据流的强大工具,特别适合处理实时数据。通过 StreamController
和 StreamBuilder
,你可以轻松地创建、管理和响应数据流。