openplanning

Dart Stream Single và Broadcast

  1. Single Subscription Stream
  2. Broadcast Stream
Trong bài viết trước chúng ta đã tìm hiểu về Dart Stream với các ví dụ cơ bản. Trong bài viết này chúng ta sẽ tìm hiểu về Single Subscription StreamBroadcast Stream.

1. Single Subscription Stream

Single Subscription Stream cho phép chỉ một bộ lắng nghe (listener) lắng nghe các sự kiện xẩy ra trên Stream trong suốt vòng đời của nó. Một khi sự kiện được phát ra hoặc Stream bị đóng lại nó sẽ không thể được lắng nghe trở lại. Nó thích hợp trong tình huống bạn muốn chắc chắn rằng chỉ có duy nhất một trình tiêu thụ được phép xử lý các sự kiện trên Stream.
Single Subscription Stream được tạo ra thông qua một StreamController.
single_ex1.dart
import 'dart:async';

Future<void> main() async {
  // Creating a Single Subscription Stream
  StreamController<int> singleController = StreamController<int>();

  // Get the stream from controller.
  Stream<int> intStream = singleController.stream;

  // Adding a listener to the stream
  StreamSubscription<int> subscription = intStream.listen(
    (data) {
      print('Received: $data');
    },
  );

  for (int i = 0; i < 3; i++) {
    await Future.delayed(Duration(seconds: 2));
    // Adding data event to the stream.
    singleController.add(i);
  }

  // Closing the stream
  singleController.close();
}
Output:
Bạn cũng có thể thêm các sự kiện lỗi vào Stream thông qua Controller.
single_ex1b.dart
import 'dart:async';

Future<void> main() async {
  // Creating a Single Subscription Stream
  StreamController<int> singleController = StreamController<int>();

  // Get the stream from controller.
  Stream<int> intStream = singleController.stream;

  // Adding a listener to the stream
  StreamSubscription<int> subscription = intStream.listen(
    (data) {
      print('Received: $data');
    },
    // catch
    onError: (Object error, StackTrace st) {
      print('Error Received: $error');
    },
    // finally
    onDone: () {
      print('Stream closed');
    },
  );

  for (int i = 0; i < 5; i++) {
    await Future.delayed(Duration(seconds: 2));
    if (i == 3) {
      // Adding error event to the stream.
      singleController.addError("A custom error at index $i");
    } else {
      // Adding data event to the stream.
      singleController.add(i);
    }
  }

  // Closing the stream
  singleController.close();
}
Output:
Received: 0
Received: 1
Received: 2
Error Received: A custom error at index 3
Received: 4
Stream closed

2. Broadcast Stream

Mặt khác, Broadcast Stream cho phép nhiều bộ lắng nghe đăng ký (subscribe) vào cùng một Stream. Điều này hữu ích khi bạn muốn phát sự kiện đến nhiều phần của ứng dụng trong cùng một thời điểm.
Broadcast Stream cũng được tạo ra thông qua StreamController.
broadcast_ex1.dart
import 'dart:async';

Future<void> main() async {
  // Create a broadcast-style StreamController.
  StreamController<int> broadcastController = StreamController<int>.broadcast();

  // Get the stream from controller.
  Stream<int> intStream = broadcastController.stream;

  // Adding the first listener to the stream
  StreamSubscription<int> subscription1 = intStream.listen(
    (data) {
      print('Listener 1 Data Received: $data');
    },
    // catch
    onError: (Object error, StackTrace st) {
      print('Listener 1 Error Received: $error');
    },
    // finally
    onDone: () {
      print('Listener 1: Stream closed');
    },
  );

  // Adding the second listener to the stream
  StreamSubscription<int> subscription2 = intStream.listen(
    (data) {
      print('Listener 2 Data Received: $data');
    },
    // catch
    onError: (Object error, StackTrace st) {
      print('Listener 2 Error Received: $error');
    },
    // finally
    onDone: () {
      print('Listener 2: Stream closed');
    },
  );

  for (int i = 0; i < 5; i++) {
    await Future.delayed(Duration(seconds: 2));
    if (i == 3) {
      // Adding error event to the stream.
      broadcastController.addError("A custom error at index $i");
    } else {
      // Adding data event to the stream.
      broadcastController.add(i);
    }
  }

  // Closing the stream
  broadcastController.close();
}
Output:
Listener 1 Data Received: 0
Listener 2 Data Received: 0
Listener 1 Data Received: 1
Listener 2 Data Received: 1
Listener 1 Data Received: 2
Listener 2 Data Received: 2
Listener 1 Error Received: A custom error at index 3
Listener 2 Error Received: A custom error at index 3
Listener 1 Data Received: 4
Listener 2 Data Received: 4
Listener 1: Stream closed
Listener 2: Stream closed

Các hướng dẫn lập trình Dart

Show More