Flutter – Stream

Stream là gì?

Một cách dễ hiểu nhất về khái niệm của Stream là nó tương tự như 1 ống nước có 2 đầu, 1 đầu chỉ cho phép bạn đẩy vào 1 vật gì đó, và vật đó sẽ đi theo luồng của ống nước và thoát khỏi ở đầu còn lại.

Related image

Trong Flutter,

  • Ống nước được gọi là Stream
  • Để điều khiển được Stream, chúng ta thường sử dụng StreamController.
  • Để đẩy 1 vật  vào Stream, StreamController sẽ tạo ra 1 lối vào được gọi là StreamSink, được sử dụng bằng thuộc tính sink
  • Thuộc tính stream của StreamController là lối ra của Stream.

Cái gì sẽ được chuyển tải bởi Stream?

Everything and Anything

Bất kể thứ gì bạn muốn từ value, event, object, collection, map, error, từ một Stream khác hoặc bất kỳ loại data nào đều có thể chuyển tải bởi Stream.

Làm sao có thể biết sự kiện được chuyển tải bởi Stream?

Khi bạn muốn được thông báo rằng 1 sự kiện được chuyển tải bởi Stream, bạn chỉ cần lắng nghe thuộc tính stream của StreamController.

Khi bạn định nghĩa 1 listener, bạn sẽ nhận được StreamSubscription object. StreamSubscription sẽ thông báo cho bạn biết có điều gì đặc biệt xảy ra trong Stream.

Khi có 1 listener được gắn vào, Stream sẽ bắt đầu tạo ra các sự kiện để thông báo cho các StreamSubscription khi:

  • Giá trị được đẩy ra khỏi Stream.
  • Có lỗi xảy ra.
  • Stream bị huỷ.

StreamSubscription cũng cho phép bạn:

  • Ngừng lắng nghe.
  • Tạm ngừng lắng nghe.
  • Tiếp tục lắng nghe.

Mỗi Stream chỉ là 1 đường ống?

Tất nhiên là KHÔNG, Stream cho phép chúng ta tạo ra nhiều luồng trước khi đẩy dữ liệu ra ngoài.

Để có thể tạo ra các luồng trong Stream, chúng ta sẽ sử dụng StreamTransformer, cái có thể hiểu qua:

  • Một function để ghi lại dữ liệu trong Stream.
  • Tác động vào dữ liệu.
  • Đầu ra của StreamTransformer cũng là 1 Stream.

Một StreamTransformer có thể sử dụng trong 1 số quá trình như:

  1. Filtering: lọc dữ liệu theo 1 định nghĩa nào đó.
  2. Regrouping: Tập hợp các dữ liệu.
  3. Modification: Chỉnh sửa dữ liệu.
  4. Chèn dữ liệu vào 1 luồng khác.
  5. Buffering.
  6. Processing: Thực hiện 1 hành động/ hoạt động nào đó dựa vào dữ liệu.
  7. v.v…

Có bao nhiêu loại Stream?

Có 2 loại Stream:

Single-subscription Stream:

Đây là loại Stream chỉ cho phép tạo duy nhất 1 listener.

Đừng cố gắng tạo thêm 1 listener trỏ vào Stream này, vì nó sẽ huỷ đi Listener đầu tiên.

import 'dart:async';

void main() {
  //
  // Initialize a "Single-Subscription" Stream controller
  //
  final StreamController ctrl = StreamController();
  
  //
  // Initialize a single listener which simply prints the data
  // as soon as it receives it
  //
  final StreamSubscription subscription = ctrl.stream.listen((data) => print('$data'));

  //
  // We here add the data that will flow inside the stream
  //
  ctrl.sink.add('my name');
  ctrl.sink.add(1234);
  ctrl.sink.add({'a': 'element A', 'b': 'element B'});
  ctrl.sink.add(123.45);
  
  //
  // We release the StreamController
  //
  ctrl.close();
}
Broadcast Streams

Ngược lại với loại trên, nó cho phép tạo rất nhiều listener.

Bạn có thể tạo rất nhiều listener vào loại Stream này, và nó chỉ lắng nghe được các sự kiện từ lúc listener đó được tạo ra.

import 'dart:async';

void main() {
  //
  // Initialize a "Broadcast" Stream controller of integers
  //
  final StreamController<int> ctrl = StreamController<int>.broadcast();
  
  //
  // Initialize a single listener which filters out the odd numbers and
  // only prints the even numbers
  //
  final StreamSubscription subscription = ctrl.stream
					      .where((value) => (value % 2 == 0))
					      .listen((value) => print('$value'));

  //
  // We here add the data that will flow inside the stream
  //
  for(int i=1; i<11; i++){
  	ctrl.sink.add(i);
  }
  
  //
  // We release the StreamController
  //
  ctrl.close();
}

 

Leave a reply:

Your email address will not be published.

Site Footer