Skip to content

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

Comments

Comments