真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

FishRedux中的Dispatch如何實(shí)現(xiàn)-創(chuàng)新互聯(lián)

這篇文章主要為大家展示了“Fish Redux中的Dispatch如何實(shí)現(xiàn)”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Fish Redux中的Dispatch如何實(shí)現(xiàn)”這篇文章吧。

創(chuàng)新互聯(lián)專業(yè)提供成都主機(jī)托管四川主機(jī)托管成都服務(wù)器托管四川服務(wù)器托管,支持按月付款!我們的承諾:貴族品質(zhì)、平民價(jià)格,機(jī)房位于中國(guó)電信/網(wǎng)通/移動(dòng)機(jī)房,四川電信科技城機(jī)房服務(wù)有保障!前言

我們?cè)谑褂胒ish-redux構(gòu)建應(yīng)用的時(shí)候,界面代碼(view)和事件的處理邏輯(reducer,effect)是完全解耦的,界面需要處理事件的時(shí)候?qū)ction分發(fā)給對(duì)應(yīng)的事件處理邏輯去進(jìn)行處理,而這個(gè)分發(fā)的過(guò)程就是下面要講的dispatch, 通過(guò)本篇的內(nèi)容,你可以更深刻的理解一個(gè)action是如何一步步去進(jìn)行分發(fā)的。

從example開(kāi)始

為了更好的理解action的dispatch過(guò)程,我們就先以todolistpage中一條todo條目的勾選事件為例,來(lái)看點(diǎn)擊后事件的傳遞過(guò)程,通過(guò)斷點(diǎn)debug我們很容易就能夠發(fā)現(xiàn)點(diǎn)擊時(shí)候發(fā)生的一切,具體過(guò)程如下:

  1. 用戶點(diǎn)擊勾選框,GestureDetector的onTap會(huì)被回調(diào)

  2. 通過(guò)buildView傳入的dispatch函數(shù)對(duì)doneAction進(jìn)行分發(fā),發(fā)現(xiàn)todo_component的effect中無(wú)法處理此doneAction,所以將其交給pageStore的dispatch繼續(xù)進(jìn)行分發(fā)

  3. pageStore的dispatch會(huì)將action交給reducer進(jìn)行處理,故doneAction對(duì)應(yīng)的_markDone會(huì)被執(zhí)行,對(duì)state進(jìn)行clone,并修改clone后的state的狀態(tài),然后將這個(gè)全新的state返回

  4. 然后pageStore的dispatch會(huì)通知所有的listeners,其中負(fù)責(zé)界面重繪的_viewUpdater發(fā)現(xiàn)state發(fā)生變化,通知界面進(jìn)行重繪更新

Dispatch實(shí)現(xiàn)分析

Dispatch在fish-redux中的定義如下

typedef Dispatch = void Function(Action action);

本質(zhì)上就是一個(gè)action的處理函數(shù),接受一個(gè)action,然后對(duì)action進(jìn)行分發(fā)。

下面我門(mén)通過(guò)源碼來(lái)進(jìn)行詳細(xì)的分析。

0component->ComponentWidget->ComponentState->_mainCtx->_dispatch而 _mainCtx的初始化則是通過(guò)componet的createContext方法來(lái)創(chuàng)建的,順著方法下去我們看到了dispatch的初始化

  1. // redux_component/context.dart DefaultContext初始化方法

  2.  DefaultContext({

  3.    @required this.factors,

  4.    @required this.store,

  5.    @required BuildContext buildContext,

  6.    @required this.getState,

  7.  })  : assert(factors != null),

  8.        assert(store != null),

  9.        assert(buildContext != null),

  10.        assert(getState != null),

  11.        _buildContext = buildContext {

  12.    final OnAction onAction = factors.createHandlerOnAction(this);

  13.    /// create Dispatch

  14.    _dispatch = factors.createDispatch(onAction, this, store.dispatch);

  15.    /// Register inter-component broadcast

  16.    _onBroadcast =

  17.        factors.createHandlerOnBroadcast(onAction, this, store.dispatch);

  18.    registerOnDisposed(store.registerReceiver(_onBroadcast));

  19.  }

context中的dispatch是通過(guò)factors來(lái)進(jìn)行創(chuàng)建的,factors其實(shí)就是當(dāng)前component,factors創(chuàng)建dispatch的時(shí)候傳入了onAction函數(shù),以及context自己和store的dispatch。onAction主要是進(jìn)行Effect處理。這邊還可以看到,進(jìn)行context初始化的最后,還將自己的onAction包裝注冊(cè)到store的廣播中去,這樣就可以接收到別人發(fā)出的action廣播。

Component繼承自Logic

  1. // redux_component/logic.dart

  2.  @override

  3.  Dispatch createDispatch(

  4.      OnAction onAction, Context ctx, Dispatch parentDispatch) {

  5.    Dispatch dispatch = (Action action) {

  6.      throw Exception(

  7.          'Dispatching while appending your effect & onError to dispatch is not allowed.');

  8.    };

  9.    /// attach to store.dispatch

  10.    dispatch = _applyOnAction(onAction, ctx)(

  11.      dispatch: (Action action) => dispatch(action),

  12.      getState: () => ctx.state,

  13.    )(parentDispatch);

  14.    return dispatch;

  15.  }

  16.    static Middleware _applyOnAction(OnAction onAction, Context ctx) {

  17.    return ({Dispatch dispatch, Get getState}) {

  18.      return (Dispatch next) {

  19.        return (Action action) {

  20.          final Object result = onAction?.call(action);

  21.          if (result != null && result != false) {

  22.            return;

  23.          }

  24.          //skip-lifecycle-actions

  25.          if (action.type is Lifecycle) {

  26.            return;

  27.          }

  28.          if (!shouldBeInterruptedBeforeReducer(action)) {

  29.            ctx.pageBroadcast(action);

  30.          }

  31.          next(action);

  32.        };

  33.      };

  34.    };

  35.  }

  36. }

Fish Redux中的Dispatch如何實(shí)現(xiàn)

上面分發(fā)的邏輯大概可以通過(guò)上圖來(lái)表示

  1. 通過(guò)onAction將action交給component對(duì)應(yīng)的effect進(jìn)行處理

  2. 當(dāng)effect無(wú)法處理此action,且此action非lifecycle-actions,且不需中斷則廣播給當(dāng)前Page的其余所有effects

  3. 最后就是繼續(xù)將action分發(fā)給store的dispatch(parentDispatch傳入的其實(shí)就是store.dispatch)

0

  • // redux/create_store.dart

  •  final Dispatch dispatch = (Action action) {

  •    _throwIfNot(action != null, 'Expected the action to be non-null value.');

  •    _throwIfNot(

  •        action.type != null, 'Expected the action.type to be non-null value.');

  •    _throwIfNot(!isDispatching, 'Reducers may not dispatch actions.');

  •    try {

  •      isDispatching = true;

  •      state = reducer(state, action);

  •    } finally {

  •      isDispatching = false;

  •    }

  •    final List<_VoidCallback> _notifyListeners = listeners.toList(

  •      growable: false,

  •    );

  •    for (_VoidCallback listener in _notifyListeners) {

  •      listener();

  •    }

  •    notifyController.add(state);

  •  };

  • store的dispatch過(guò)程比較簡(jiǎn)單,主要就是進(jìn)行reducer的調(diào)用,處理完成后通知監(jiān)聽(tīng)者。

    0

  • // redux_component/component.dart

  •  Widget buildPage(P param) {

  •    return wrapper(_PageWidget(

  •      component: this,

  •      storeBuilder: () => createPageStore(

  •            initState(param),

  •            reducer,

  •            applyMiddleware(buildMiddleware(middleware)),

  •          ),

  •    ));

  •  }

  • // redux_component/page_store.dart

  • PageStore createPageStore(T preloadedState, Reducer reducer,

  •        [StoreEnhancer enhancer]) =>

  •    _PageStore(createStore(preloadedState, reducer, enhancer));

  • // redux/create_store.dart

  • Store createStore(T preloadedState, Reducer reducer,

  •        [StoreEnhancer enhancer]) =>

  •    enhancer != null

  •        ? enhancer(_createStore)(preloadedState, reducer)

  •        : _createStore(preloadedState, reducer);

  • 所以這里可以看到,當(dāng)傳入enhancer時(shí),createStore的工作被enhancer代理了,會(huì)返回一個(gè)經(jīng)過(guò)enhancer處理過(guò)的store。而PageStore創(chuàng)建的時(shí)候傳入的是中間件的enhancer。

    1. // redux/apply_middleware.dart

    2. StoreEnhancer applyMiddleware(List> middleware) {

    3.  return middleware == null || middleware.isEmpty

    4.      ? null

    5.      : (StoreCreator creator) => (T initState, Reducer reducer) {

    6.            assert(middleware != null && middleware.isNotEmpty);

    7.            final Store store = creator(initState, reducer);

    8.            final Dispatch initialValue = store.dispatch;

    9.            store.dispatch = (Action action) {

    10.              throw Exception(

    11.                  'Dispatching while constructing your middleware is not allowed. '

    12.                  'Other middleware would not be applied to this dispatch.');

    13.            };

    14.            store.dispatch = middleware

    15.                .map((Middleware middleware) => middleware(

    16.                      dispatch: (Action action) => store.dispatch(action),

    17.                      getState: store.getState,

    18.                    ))

    19.                .fold(

    20.                  initialValue,

    21.                  (Dispatch previousValue,

    22.                          Dispatch Function(Dispatch) element) =>

    23.                      element(previousValue),

    24.                );

    25.            return store;

    26.          };

    27. }

    這里的邏輯其實(shí)就是將所有的middleware的處理函數(shù)都串到store的dispatch,這樣當(dāng)store進(jìn)行dispatch的時(shí)候所有的中間件的處理函數(shù)也會(huì)被調(diào)用。下面為各個(gè)處理函數(shù)的執(zhí)行順序,

    Fish Redux中的Dispatch如何實(shí)現(xiàn)

    首先還是component中的dispatch D1 會(huì)被執(zhí)行,然后傳遞給store的dispatch,而此時(shí)store的dispatch已經(jīng)經(jīng)過(guò)中間件的增強(qiáng),所以會(huì)執(zhí)行中間件的處理函數(shù),最終store的原始dispatch函數(shù)D2會(huì)被執(zhí)行。

以上是“Fish Redux中的Dispatch如何實(shí)現(xiàn)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道!


名稱欄目:FishRedux中的Dispatch如何實(shí)現(xiàn)-創(chuàng)新互聯(lián)
文章起源:http://weahome.cn/article/dpgdgi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部