Flutter中的EventSink与StreamSink以及StreamSubscription
题记:不到最后时刻,千万别轻言放弃,无论结局成功与否,只要你拼博过,尽力过,一切问心无愧。
Flutter文章目录
StreamSink 是一个 interface 接口,它继承于 StreamConsumer 和 EventSink。
StreamConsumer是一个接口,用于消费流事件,它是Flutter中的一种异步编程模型,用于处理数据流。
StreamSink 可以用于以下场景:
- 在 Flutter 中,StreamSink 可以用于将用户输入添加到一个输入流中,以便在 UI 上显示
- 在 Dart 中,StreamSink 可以用于将数据添加到一个流中,以便在其他地方使用
- StreamSink 还可以用于将错误添加到流中,以便在其他地方处理错误
// 创建一个 StreamController
StreamController<int> controller = StreamController<int>();// 获取 StreamSink,它是 EventSink 的一个实现
StreamSink<int> sink = controller.sink;// 添加数据到 Stream 中
sink.add(1);
sink.add(2);
sink.add(3);// 关闭 StreamController
sink.close();// 创建一个 StreamSubscription 来监听 Stream 中的数据
StreamSubscription<int> subscription = controller.stream.listen((data) {print('Data: $data');
});// 输出:
// Data: 1
// Data: 2
// Data: 3
EventSink是一个抽象类,它提供了一个add方法,用于将事件添加到流中。
import 'dart:async';// Create a custom EventSink
class CustomEventSink implements EventSink<String> {final EventSink<String> _eventSink;CustomEventSink(this._eventSink);void add(String data) {// Add custom logic here_eventSink.add(data);}void addError(Object error, [StackTrace? stackTrace]) {// Add custom error handling here_eventSink.addError(error, stackTrace);}void close() {// Add custom logic here_eventSink.close();}
}// Create a StreamController and use the custom EventSink
void main() {final controller = StreamController<String>.broadcast(sync: true,onListen: () => print('Listening...'),onCancel: () => print('Cancelled!'),);final customSink = CustomEventSink(controller.sink);controller.stream.listen(print);customSink.add('Hello, world!');customSink.close();
}
StreamSubscription 是什么?
StreamSubscription 是用于监听 Stream 中数据、错误和完成事件的对象。它提供了多个方法,包括 onData、onError、onDone、pause、resume 和 cancel。通过这些方法,我们可以对 StreamSubscription 进行控制,例如暂停、恢复和取消订阅。
StreamSubscription的常用方法包括:
- onData:用于监听Stream中的数据,每当有新的数据时就会调用该方法。
- onError:用于监听Stream中的错误,每当有错误发生时就会调用该方法。
- onDone:用于监听Stream中的完成事件,当Stream完成时就会调用该方法。
- pause:用于暂停StreamSubscription,暂停后不再接收新的数据。
- resume:用于恢复StreamSubscription,恢复后可以继续接收数据。
- cancel:用于取消StreamSubscription,取消后不再接收数据。
以下是一个示例代码:
// 创建一个 StreamController
StreamController<int> controller = StreamController<int>();// 获取 StreamSubscription,用于监听 Stream 中的数据、错误和完成事件
StreamSubscription<int> subscription = controller.stream.listen((data) {print('Data: $data');},onError: (error) {print('Error: $error');},onDone: () {print('Done');},
);
// 添加数据到 Stream 中
controller.sink.add(1);
controller.sink.add(2);
controller.sink.add(3);// 暂停 StreamSubscription
subscription.pause();// 添加数据到 Stream 中
controller.sink.add(4);
controller.sink.add(5);// 恢复 StreamSubscription
subscription.resume();// 添加数据到 Stream 中
controller.sink.add(6);// 关闭 StreamController
controller.sink.close();// 取消 StreamSubscription
subscription.cancel();