flutter stream (I/O)
- StreamController
- Sink
- Stream
- StreamSubscription
- stream 的简单使用
class CustomStreams {
final StreamController<List<int>> _streamController = StreamController<List<int>>();
StreamSink<List<int>> get _streamSink => _streamController.sink;
Stream<List<int>> get _streamCall => _streamController.stream;
late StreamSubscription _streamSubscription;
// 接送数据流
void mySelfInit(){
_streamSubscription = _streamCall.listen((event) {
print('event $event');
});
_streamSubscription.onData((data) {
String str = utf8.decode(data);
print('datd : $str');
});
_streamSubscription.onDone(() {
print('onDone');
});
}
void sendStream(){
String str = 'Hi hello';
var data = utf8.encode(str);
_streamSink.addStream(Stream.value(data));
}
void sendEvent(){
String str = 'Hi hello';
var data = utf8.encode(str);
_streamSink.add(data);
}
void closeStream(){
_streamSubscription.cancel();
_streamController.close();
}
}
- stream 结合 StreamBuilder 使用
StreamBuilder<List<String>>(
stream: dataStream,
initialData: ["none"],
///这里的 snapshot 是数据快照的意思
builder: (BuildContext context, AsyncSnapshot<List<String>> snapshot) {
///获取到数据,更新 UI
var data = snapshot.data;
return Container();
});
...以下是官方案例
Receiving stream events
Future<int> sumStream(Stream<int> stream) async {
var sum = 0;
await for (final value in stream) {
sum += value;
}
return sum;
}
case
Future<int> sumStream(Stream<int> stream) async {
var sum = 0;
await for (final value in stream) {
sum += value;
}
return sum;
}
Stream<int> countStream(int to) async* {
for (int i = 1; i <= to; i++) {
yield i;
}
}
void main() async {
var stream = countStream(10);
var sum = await sumStream(stream);
print(sum); // 55
}
Reading and decoding a file
import 'dart:convert';
import 'dart:io';
void main(List<String> args) async {
var file = File(args[0]);
var lines = utf8.decoder
.bind(file.openRead())
.transform(const LineSplitter());
await for (final line in lines) {
if (!line.startsWith('#')) print(line);
}
}
周期性
var counterStream =
Stream<int>.periodic(const Duration(seconds: 1), (x) => x)
.where((event) => event.isEven)// 偶数
.expand((element) => [element,element])
.take(1);
counterStream.forEach(print);
网友评论