Trong phát triển ứng dụng di động với Flutter, việc xử lý dữ liệu bất đồng bộ và cập nhật giao diện người dùng theo thời gian thực là rất quan trọng. Một trong những công cụ mạnh mẽ giúp đạt được điều này là luồng (streams). Luồng cho phép bạn nhận và xử lý dữ liệu một cách liên tục, từ nhiều nguồn khác nhau như API, cảm biến, hoặc sự kiện người dùng. Bài viết này sẽ khám phá hai loại luồng chính trong Flutter: Single Subscription StreamsBroadcast Streams. Chúng ta sẽ đi sâu vào cách sử dụng, ứng dụng thực tiễn và các ví dụ cụ thể, giúp bạn hiểu rõ hơn về cách tích hợp luồng vào dự án Flutter của mình một cách hiệu quả và dễ dàng.

Luồng (Streams) trong Flutter

Luồng là một cách để xử lý dữ liệu bất đồng bộ và gửi dữ liệu từ một nguồn đến một hoặc nhiều listener (nghe) một cách liên tục. Trong Flutter, luồng thường được sử dụng để nhận dữ liệu từ các nguồn như API, cảm biến, hoặc sự kiện người dùng. Có hai loại luồng chính mà bạn cần biết: Single Subscription StreamsBroadcast Streams.

Single Subscription Streams

Single Subscription Streams là loại luồng mà chỉ có thể lắng nghe một lần duy nhất. Nếu bạn cố gắng tạo một listener thứ hai cho cùng một luồng, sẽ xảy ra lỗi.

Sử dụng Single Subscription Streams

Single Subscription Streams thích hợp cho những tình huống mà bạn cần xử lý dữ liệu một lần, như khi nhận dữ liệu từ API hoặc khi thực hiện một tác vụ bất đồng bộ mà chỉ cần một listener.

Ví dụ về Single Subscription Streams

Dưới đây là ví dụ về cách sử dụng Single Subscription Streams trong Flutter. Ví dụ này sẽ tạo một luồng đếm ngược từ một số nguyên nhất định:

import 'dart:async';

Stream<int> countdown(int start) async* {
  for (int i = start; i >= 0; i--) {
    yield i;
    await Future.delayed(Duration(seconds: 1));
  }
}

void startCountdown() {
  countdown(10).listen((data) {
    print(data); // In ra từng số từ 10 đến 0
  });
}

Trong ví dụ này, hàm countdown trả về một luồng Stream<int>, phát ra giá trị từ start xuống 0 với mỗi giây một lần. Hàm startCountdown sẽ lắng nghe luồng này và in ra giá trị mỗi khi nó được phát ra.

Broadcast Streams

Broadcast Streams là loại luồng cho phép nhiều listener cùng lắng nghe cùng một luồng mà không bị hạn chế. Khi một sự kiện được phát ra, tất cả các listener sẽ nhận được thông báo.

Sử dụng Broadcast Streams

Broadcast Streams rất hữu ích trong những tình huống mà bạn cần nhiều widget hoặc thành phần trong ứng dụng nhận cùng một dữ liệu, như khi bạn phát thông báo từ một phần của ứng dụng đến nhiều phần khác.

Ví dụ về Broadcast Streams

Dưới đây là ví dụ về cách sử dụng Broadcast Streams trong Flutter. Trong ví dụ này, chúng ta sẽ sử dụng một StreamController để tạo ra một luồng phát thông báo:

import 'dart:async';

class NotificationService {
  final StreamController<String> _controller = StreamController<String>.broadcast();

  Stream<String> get notifications => _controller.stream;

  void sendNotification(String message) {
    _controller.add(message);
  }
}

void main() {
  final notificationService = NotificationService();

  notificationService.notifications.listen((message) {
    print('Listener 1: $message');
  });

  notificationService.notifications.listen((message) {
    print('Listener 2: $message');
  });

  notificationService.sendNotification('Hello, World!'); // Cả hai listener đều nhận được thông báo
}

Trong ví dụ trên, NotificationService sử dụng StreamController<String> với phương thức broadcast(), cho phép nhiều listener lắng nghe cùng một luồng thông báo. Khi gọi phương thức sendNotification, tất cả các listener đã đăng ký sẽ nhận được thông báo.

Tóm tắt

  • Single Subscription Streams: Chỉ có một listener có thể lắng nghe. Sử dụng cho các tác vụ bất đồng bộ mà không cần nhiều listener.
  • Broadcast Streams: Cho phép nhiều listener lắng nghe cùng một luồng. Thích hợp cho các trường hợp phát thông báo đến nhiều phần của ứng dụng.