Flutter 響應式框架RxDart學習

一、rxdart是什麼?
rx有個外號叫從入門到放棄
RxDart就是一個響應式編程,與之相關的還有他自己的全家桶(RxKotlin,RxJava,RxJS,RxSwift…)。。。
RxDart 是基於 ReactiveX 的響應式函數編程庫。Dart本身有 Stream API,RxDart在其上增加了其他方法。

ReactiveX是一個強大的庫,用於通過使用可觀察序列來編寫異步和基於事件的程序。它突破了語言和平臺的限制,讓我們編寫異步程序更加的簡單。

在Dart庫中,有兩種實現異步編程的方式(Future和Stream),使用它們只需要在代碼中引入dart:async即可。

二、rxdart的功能
爲了將Stream的概念可視化與簡單化,可以將它想成是管道(pipe)的兩端,它只允許從一端插入數據並通過管道從另外一端流出數據。
在Flutter中,

  • 我們將這樣的管道稱作Stream;
  • 爲了控制Stream,我們通常可以使用StreamController來進行管理;
  • 爲了向Stream中插入數據,StreamController提供了類型爲StreamSink的屬性sink作爲入口;
  • StreamController提供stream屬性作爲數據的出口。

在這裏插入圖片描述
這個模式的關鍵思維在於觀察者的無狀態。我們平時調用方法的時候一定是很清楚我們什麼時候調用,並立刻會返回一個預想的結果。

但是在這裏,我們中間進行處理的時候,完全是處於異步狀態的,也就是說無法立刻返回一個值。我們不知道stream什麼時候會“吐”出處理結果,所以必須要一個觀察者來守着這個出口。

當有事件/數據流出時,觀察者捕捉到了這個事件並解析處理。

在這裏插入圖片描述
Observable實現並擴展了Stream。它將常用的stream和streamTransformer組合成了非常好用的api。你可以把它想像成stream。

Subject實現並擴展了StreamController,它符合StreamController的所有規範。假如您之前使用的StreamController,那麼你可以直接替換爲Subject。你可以把它想像成streamController。

可觀察對象——Observable
從一個Stream中創建

 var obs = Observable(Stream.fromIterable([1,2,3,4,5]));
  obs.listen(print);

常用操作符
1、迭代地處理數據:map
map方法能夠讓我們迭代的處理每一個數據並返回一個新的數據

map最常見的使用場景就是:當你從REST API或者數據庫中讀取數據時,需要將這些數據轉化爲你需要的自定義類型:

var obs = Observable(Stream.fromIterable([1,2,3,4,5]))
    .map((item)=>++item);
    
obs.listen(print);

輸出:2 3 4 5 6
在這裏插入圖片描述

2、擴展流:expand
expand方法能夠讓我們把每個item擴展至多個流

 var obs = Observable(Stream.fromIterable([1,2,3,4,5]))
   .expand((item)=> [item,item.toDouble()]);

 obs.listen(print);

輸出:1 1.0 2 2.0 3 3.0 4 4.0 5 5.0
在這裏插入圖片描述

3、合併流:merge
merge方法能夠讓我們合併多個流,請注意輸出。

var obs = Observable.merge([
    Stream.fromIterable([1,2,3]),
    Stream.fromIterable([4,5,6]),
    Stream.fromIterable([7,8,9]),
  ]);

  obs.listen(print);

輸出:1 4 7 2 5 8 3 6 9
在這裏插入圖片描述

4、檢查每一個item:every
every會檢查每個item是否符合要求,然後它將會返回一個能夠被轉化爲 Observable 的 AsObservableFuture< bool>。

var obs = Observable.fromIterable([1,2,3,4,5]);
  obs.every((x)=> x < 10).asObservable().listen(print);

其他操作符:Where:數據過濾 Debounce:數據攔截 Distinct:過濾相同數據

Subject對象
  Subject是RxDart的流控制器(StreamController),但Subject但行爲跟StreamControllers還是有些區別的:

1、 PublishSubject
就像普通的廣播 StreamController一樣,但是返回的是一個 Observable 而不是 Stream。
特點:PublishSubject 是最直接的一個 Subject。當一個數據發射到 PublishSubject 中時,PublishSubject 將立刻把這個數據發射,並且接收到訂閱之後的所有數據。
允許向監聽者發送數據、錯誤和完成的事件。
默認情況下,PublishSubject 是一個廣播(又稱hot)控制器,可多次訂閱。

2、 BehaviorSubject
特點:只保留最後一個值。在創建的時候可以指定一個初始值,這樣可以確保訂閱者訂閱的時候可以立刻收到一個值,並且接收到訂閱前的最後一條數據和訂閱後的所有數據。

作爲一個特殊的StreamController,捕獲添加進控制器的最新項,並且作爲第一項發送給新的監聽者。

允許向監聽者發送數據、錯誤和完成的事件。把添加進來的最新項發送給新的監聽者,之後,新事件將適當的發送給監聽者。如果沒有新項加入,可能提供原始值。
默認情況下,BehaviorSubject 是一個廣播(又稱hot)控制器,可多次訂閱。

subject和操作符的結合:
下面這個例子就是過濾操作判斷奇偶數:

var subject = new PublishSubject<int>();

subject.where((val) => val.isOdd)
    .listen( (val) => print('奇數: $val'));


subject.where((val) => val.isEven)
.listen( (val) => print('偶數: $val'));


subject.add(1);
subject.add(2);
subject.add(3);

輸出:
奇數: 1
偶數: 2
奇數: 3

Subject的釋放
爲了防止內存泄漏,當你不再收聽Subject,或者Subject不再使用時,請務必釋放它。你可以調用subscription的cancel()方法讓某個聽衆取消收聽,或者Subject.close(),關閉整個流。

三、總結

響應式的好處
1、在業務層面實現代碼邏輯分離,方便後期維護和拓展
2、極大提高程序響應速度,充分發掘CPU的能力
3、幫助開發者提高代碼的抽象能力和充分理解業務邏輯
4、Rx豐富的操作符會幫助我們極大的簡化代碼邏輯

Rx的最大魅力就是讓你能夠在Stream上自由操作數據,每一個Rx方法都會返回一個新的Stream,同時攜帶了一個返回值,這意味着你可以鏈式調用,這是非常有用的。

先理清楚業務之間的關係,需要和並邏輯的時候,就去去查合併類的操作符,需要條件判斷來分流的邏輯時去找條件判斷類的操作符。

在這裏插入圖片描述
https://github.com/ReactiveX/rxdart

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章