Dart Stream Single và Broadcast
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 Stream và Broadcast 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
- Kiểu dữ liệu Boolean trong Dart
- Hướng dẫn và ví dụ hàm trong Dart
- Hướng dẫn và ví dụ Dart Closures
- Interface trong Dart
- Hướng dẫn và ví dụ phương thức trong Dart
- Constructor trong Dart
- Property trong Dart
- Toán tử chấm chấm (..) trong Dart
- Hướng dẫn và ví dụ Dart Generics
- Lập trình Dart với công cụ trực tuyến DartPad
- Cài đặt Dart SDK trên Windows
- Cài đặt Visual Studio Code trên Windows
- Cài đặt Dart Code Extension cho Visual Studio Code
- Cài đặt Dart Plugin cho Android Studio
- Chạy ví dụ Dart đầu tiên của bạn trong Visual Studio Code
- Chạy ví dụ Dart đầu tiên của bạn trong Android Studio
- Hướng dẫn và ví dụ Dart Stream
- Dart JSON với thư viện dart:convert
- Hướng dẫn và ví dụ Dart List
- Biến (Variable) trong ngôn ngữ Dart
- Hướng dẫn và ví dụ Dart Map
- Vòng lặp trong Dart
- Xử lý Dart JSON với gói dart_json_mapper
- Trình chuyển đổi mã nguồn (Transpiler) là gì?
- Phân tích XML trong Dart
- Hướng dẫn và ví dụ Dart http
- Hướng dẫn và ví dụ Dart Future
- Các phương thức mở rộng (Extension) trong Dart
- Mixins trong Dart
- Bài thực hành Dart phân tích JSON với gói dart:convert
- Bài thực hành Dart http CRUD
- Từ khoá part và part of trong Dart
- Hướng dẫn và ví dụ Dart Dio
- So sánh đối tượng trong Dart với thư viện Equatable
- Xử lý lỗi trong Dart Stream
- Dart Stream Single và Broadcast
Show More