讓我們先拋開flutter這個平台說話,如果讓你實現資料共享,你能想到的基礎方案有哪些。
ok,以上方案真的是簡單粗暴,好用到哭,然而,設計到資料資料變更之後及時通知到各個關注方就顯得有點捉襟見肘了。
因此,因為有這樣的一些需求存在,業界的一些大神(懶人)們通過不懈的努力,做出了一些驚天地,泣鬼神的全域性資料共享通知方案。
那麼,在flutter上,我比較關注的是,
redux,和
event_bus 了,本文就是想來總結一下自己對redux和event_bus的理解心得。
理解成本比較高,個人覺得耦合性也比較高,要搞清楚redux的原理,先要了解一下幾個概念
store
這裡是他的建構函式,我們先不要管裡面的一堆引數,看一眼就好。
store(
this.reducer, )複製**
store可以簡單的理解為乙個容納各種資料以及對資料處理的action的乙個倉庫,可以看到可以給它配置乙個泛型,這個泛型代表的就是下面的state,好,我們接著看state。
state
state實際上並不是dart的基礎型別,他其實就是上面store定義中的那個s,對的,他就是乙個泛型,他可以是dart基礎型別string,int,double,也可以是你定義的class,都ok。總之一句話,他就是store要守護的和維護的那個份資料。
storeprovider
這裡是他的建構函式,這裡的引數比較簡單,可以直接就了解一下
const storeprovider()複製**
乙個store,乙個child是乙個widget型別,所以理解起來是不是就是將這個store和child繫結起來的橋梁啊,嗯,牽線媒婆,store中的資料有變更可以通知到到child更新tree,那麼具體child中的哪些個子child需要更新,是有誰決定的,當然是storeconnector,媒婆把人給你放一起,你牽不牽手他可不管,誰管,肯定是storeconnector啊,好,我們看storeconnector。
storeconnector
還是來看一下建構函式
storeconnector()複製**
這個建構函式的引數就有點多了,如果你感興趣可以都了解一下,沒時間的話,只需要了解required標記的。第乙個是builder,這個就是widgetbuilder,很明顯,構建view用的,非常重點的converter這個引數,看一下converter的定義:
/// convert the entire store into a viewmodel. the viewmodel will be used
/// to build a widget using the viewmodelbuilder.
typedef storeconverter= viewmodel function(
storestore,
);複製**
看到之後也就沒那麼神秘了,就是將store轉換為了viewmodel,轉了之後,實際上就是可以更好的將資料交給builder去構建view,是嗎?難道不是嗎?我們前面提到了store可以接受到乙個改變裡面資料的action,那麼這些action是誰給處理的呢?回過頭來看store的建構函式,裡面的第乙個引數是reducer,reducer的英文翻譯為減速器,還原劑,反正就是聽著挺彆扭的,他不就是乙個狀態轉換器嘛,資料有乙個狀態,經過action的處理,變成另外乙個狀態,是嗎,這樣你好理解了麼?好吧,來看看reducer。
reducer
reducer的定義如下:
typedef state reducer(state state, dynamic action);複製**
middleware
定義如下
/// ### example
////// loggingmiddleware(storestore, action, nextdispatcher next) : $action');
////// next(action);
/// }
////// // create your store with the loggingmiddleware
/// final store = new store(
/// counterreducer,
/// middleware: [loggingmiddleware],
/// );
typedef void middleware(
storestore,
dynamic action,
nextdispatcher next,
);複製**
對,處理完之後,交給後面的action,理解起來也沒什麼成本了,好,那麼總結一下我們將的這些概念,將他們串起來,用一副圖來表達。
用一句話來描述就是:
store通過storeprovider將自己給暴露出來,交給storeconnector來更好鏈結到控制項上,控制項(也不一定需要在控制項**,只不過我們好理解點)傳送action交給store中的reducer處理,如果有中介軟體存在,那麼中介軟體先攔截之後在交給recuder處理。處理之後store中的資料變更了,將會經有storeconnector通知元件更新。ok流程就這麼跑完了。
理解成本略低,耦合性也較低
初始化
import 'package:event_bus/event_bus.dart';
eventbus eventbus = new eventbus();複製**
傳送事件
eventbus.fire(event);複製**
監聽事件
eventbus.on().listen((event) );複製**
也沒有太多的概念,無恥的盜一幅圖來說就是
用一句話總結就是:對於某處所做的變更,如果想通知出去,那麼交給匯流排吧,誰想關心誰問匯流排取。
總體上來看,redux和bus都可以實現全域性資料共享及變更通知,但是bus更加好理解概念也每有那麼多,也不像redux需要通過storeconnector那麼與控制項繫結,造成不必要的耦合,個人傾向於使用bus解決全域性資料共享變更通知的需求。
Android共享全域性資料
在平時的開發中,有時候我們需要一些全域性資料,來讓應用中的所有activity和view都能訪問,大家在遇到這種情況時,可能首先會想到自己定義乙個類,然後建立很多靜態成員,不過android已經為我們提供了解決方案,下面就來介紹一下 1 2345 6789 1011 private int scor...
Android共享全域性資料
在平時的開發中,有時候我們需要一些全域性資料,來讓應用中的所有activity和view都能訪問,大家在遇到這種情況時,可能首先會想到自己定義乙個類,然後建立很多靜態成員,不過android已經為我們提供了解決方案,下面就來介紹一下 1 2345 6789 1011 private int scor...
vue 父子元件與全域性資料傳遞共享
一,元件間資料傳遞 實際工作中會遇到一些復用程度高的功能,自己會封裝小組件全域性呼叫,在元件中通過自定義props裡的值,例如 在需要呼叫的元件中先import 元件進來,自定義標籤引入,在標籤上傳入props接受的引數 二 通過檔案,靜態儲存 這個是猜出來的使用方法,比如一些靜態方法 特殊的資料都...