一、概述
Flux
的特點:
- 資料是單向的
App
被分為三個部分View
:App
介面,它根據使用者互動創造相應的響應Action
。Dispatcher
:處理中心,接收各種Action
並路由到對應的Store
。Store
:維護App
各個模組的資料狀態,他們會根據當前的動作Action
處理不同的業務狀態,會產生一個change
事件來通知View
更新狀態。Action
是一個簡單的Java
物件,包含type
和data
。
二、Action
Type
:String
型別標示事件型別。
Data
:Map
型別,攜帶這個動作需要的資料。
Bundler data = new Bundle();
data.put("USER_ID", id);
Action action = new ViewAction("SHOW_USER", data);
複製程式碼
三、Store
Store
模組包含了App
狀態和業務邏輯,它能管理各種物件的狀態而不是一個。
Store
必須暴露一個介面來獲取App
狀態,這樣View
模組就可以訪問Store
模組來更新UI
。
Store
的職責不是用來從外部獲取資料,而是用來跟蹤通過Action
獲取的資料。
四、網路請求和非同步回撥
非同步網路請求是通過Action Creator
觸發的,API Adapter
模組負責請求API
並返回結果,最後Action Creator
會把相應的Action
和資料傳送出去。
Store
完全是同步模型,這樣使Store
的內部邏輯更簡單。
所有的Action
都是通過Action Creator
觸發的,把所有的Action
都集中在一個地方,容易排查bug
。
五、Todo App
原始碼
1.1 actions/Action
:一個Action
對應一個事件,並且包含了該事件相關聯的資料。
1.2 actions/ActionCreator
:這是一個單例模式,他構造時需要傳入一個Dispatcher
物件,封裝一些方法,並通過Dispatcher
分發出去。
public static ActionCreator get(Dispatcher dispatcher) { //ActionCreator和Dispatcher類似,都是單例模式。
if (instance == null) {
instance = new ActionCreator(dispatcher);
}
return instance;
}
public void create(String text) {
dispatcher.dispatch(TodoActions.TODO_CREATE, TodoActions.KET_TEXT, text);
}
複製程式碼
1.3 actions/TodoActions
:封裝Action
相關的常量。
dispatcher/Dispatcher
:這也是一個單例模式,他構造時需要傳入一個Bus
物件,它提供了register
和unRegister
,並通過bus
傳送出去。
//構造時和Bus相關聯。
public static Dispatcher get(Bus bus) {
if (instance == null) {
instance = new Dispatcher(bus);
}
return instance;
}
複製程式碼
model/Todo
:表示一個事件。
stores/Store
:它是一個介面,同樣和Dispatcher
相關聯,他的子類是TodoStore
。
整個資料流的流程是:
Activity發起事件 -> ActionCreator#xxx -> Dispatcher#dispatch -> Bus#post -> TodoStore#onAction -> TodoStore#emitChange -> Bus#post -> Activity#onTodoStoreChange
複製程式碼
Activity
接收資料的流程
Activity#onTodoStoreChange -> updateUi -> TodoStore#getTodos()
複製程式碼