Stream2
使用stream controllers 和 sinks¶
StreamController 創建連結的 Stream 和 Sink。雖然stream包含可由任何訂閱者接收的按順序發出的數據,但sink用於插入事件。¶
A stream controller simplifies stream management, automatically creating a stream and a sink, and methods to control their events and features.
Code¶
//main.dart 中加入以下
import 'dart:async';
import 'dart:math';
class StreamNumber extends StatefulWidget {
const StreamNumber({super.key});
@override
State<StreamNumber> createState() => _StreamNumberState();
}
class _StreamNumberState extends State<StreamNumber> {
int lastNumber = 0;
NumberStream? numberStream;
StreamController? numberStreamController;
@override
void initState() {
numberStream = NumberStream();
numberStreamController = numberStream?.controller;
Stream? stream = numberStreamController?.stream;
stream?.listen((event) {
setState(() {
lastNumber = event;
});
});
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);
}
}
程式碼解釋(Part 1)¶
這段程式碼定義了一個名為 `StreamNumber` 的 `StatefulWidget`,以及其對應的狀態類別 `_StreamNumberState`。
在 `_StreamNumberState` 中,我們定義了一個 `lastNumber` 變數來存儲最後一個從 Stream 中接收到的數字,以及一個 `NumberStream` 和一個 `StreamController`。在 `initState` 方法中,我們初始化這些變數,並設定一個監聽器來監聽 Stream 的事件。每當 Stream 有新的事件時,我們就更新 `lastNumber` 的值。
在 `build` 方法中,我們創建了一個 `Scaffold`,它包含一個 `Container`。在 `Container` 中,我們有一個 `Column`,它包含一個顯示 `lastNumber` 的 `Text` 部件和一個 `ElevatedButton` 部件。當按鈕被按下時,會調用 `addRandomNumber` 方法。
`addRandomNumber` 方法創建一個隨機數字,然後將這個數字添加到 Stream 中。這將觸發 Stream 的監聽器,並更新 `lastNumber` 的值。
這個部件的主要功能是從一個 Stream 中接收隨機數字,並在 UI 中顯示這些數字。這是一個很好的示例,展示了如何在 Flutter 中使用 Stream 來處理異步數據。
import 'dart:async';
class NumberStream {
StreamController controller = StreamController();
addNumberToSink(int newNumber) {
controller.sink.add(newNumber);
}
close() {
controller.close();
}
}
程式碼解釋(Part 2)¶
這段程式碼定義了一個名為 `NumberStream` 的類別,該類別用於處理數字的 Stream。
在 `NumberStream` 類別中,我們定義了一個 `StreamController`。`StreamController` 是 Dart 的一個核心類別,用於創建和管理 Stream。在這裡,我們使用 `StreamController` 來創建一個可以發送和接收數字的 Stream。
`addNumberToSink` 方法用於將新的數字添加到 Stream 中。這個方法接收一個數字作為參數,並使用 `StreamController` 的 `sink.add` 方法將這個數字添加到 Stream 中。在 Dart 中,`sink` 是一個可以接收數據的接口,`add` 方法用於將數據添加到 `sink` 中。
`close` 方法用於關閉 Stream。當你不再需要 Stream 時,應該調用這個方法來關閉 Stream,以釋放相關的資源。
總的來說,這個類別提供了一個簡單的接口,用於創建一個數字的 Stream,並向這個 Stream 中添加和移除數字。
您可以將stream視為具有兩端的單向管道。管道的一端只允許插入數據,另一端是數據輸出的地方。
In Flutter, you can do the following:
- You can use a stream controller to control a stream.
- A stream controller has a sink property to insert new data.
- The stream property of StreamController is a way out of StreamController.
具體來說,StreamController是 StreamSink 類的實例,它是stream的“進入方式”。
StreamController 的 stream 屬性包含流的實例,我們可以利用 listen 方法偵聽 Stream。
Last update :
13 novembre 2024
Created : 13 novembre 2024
Created : 13 novembre 2024