Stream3
transformer¶
Code¶
class _StreamNumberState extends State<StreamNumber> {
int lastNumber = 0;
StreamTransformer? transformer;
NumberStream? numberStream;
StreamController? numberStreamController;
@override
void initState() {
numberStream = NumberStream();
numberStreamController = numberStream?.controller;
Stream? stream = numberStreamController?.stream;
// stream?.listen((event) {
// setState(() {
// lastNumber = event;
// });
// });
transformer = StreamTransformer<dynamic, dynamic>.fromHandlers(
handleData: (value, sink) {
sink.add(value * 10);
},
handleError: (error, trace, sink) {
sink.add(-1);
},
handleDone: (sink) => sink.close());
stream?.transform(transformer!).listen((event) {
setState(() {
lastNumber = event;
});
}).onError((error) {
setState(() {
lastNumber = -1;
});
});
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
width: double.infinity,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(lastNumber.toString()),
ElevatedButton(
onPressed: () => addRandomNumber(),
child: Text('New Random Number'),
)
],
),
),
);
}
void addRandomNumber() {
Random random = Random();
int myNum = random.nextInt(10);
numberStream?.addNumberToSink(myNum);
}
}
使用 StreamTransformer.fromHandlers 構造函數,可以使用三個命名參數指定回調函數:handleData、handleError 和 handleDone。
handleData 接收從流發出的數據事件。這是應用需要執行的轉換的位置。您在 handledata 中指定的函數將流發出的數據和當前流的 EventSink 實例作為參數接收。
在這裡,您使用 add 方法將轉換後的數據發送到流偵聽器。handleError 回應流發出的錯誤事件。此處的參數包含錯誤、堆疊跟蹤和 EventSink 實例。當沒有更多數據時,當調用流接收器的 close() 方法時,將調用 handleDone。
transformer使用原因¶
使用 StreamTransformer 可以讓你在數據從 Stream 流出時進行處理或轉換。如果你不使用 StreamTransformer,則 Stream 的數據將直接傳遞給監聽器,不會進行任何處理或轉換。
在你的程式碼中,你的 StreamTransformer 將每個數據乘以 10,然後將結果添加到輸出的 Stream 中。如果你不使用這個 StreamTransformer,則 Stream 的數據將直接傳遞給監聽器,不會被乘以 10。
所以,使用 StreamTransformer 的主要差別在於你可以在數據從 Stream 流出時進行處理或轉換。這可以讓你更靈活地處理 Stream 的數據,例如進行錯誤處理、數據轉換、過濾不需要的數據等。
Last update :
13 novembre 2024
Created : 13 novembre 2024
Created : 13 novembre 2024