手把手入門Fish-Redux開發flutter(上)

擁小抱發表於2019-10-11

本文適合已經入門flutter,沒有了解過Redux,但對Fish-Redux感興趣的同學。

手把手入門Fish-Redux開發flutter(上) (中) (下)

1 Fish-Redux介紹

眾所周知,redux是一個前端的狀態管理框架。

Fish-Redux 是阿里閒魚團隊開發的flutter應用框架。用其官方文件的原文描述就是 “Fish Redux 是一個基於 Redux 資料管理的組裝式 flutter 應用框架, 它特別適用於構建中大型的複雜應用。”

1.1 Fish-Redux組成部分

作為沒有前端經驗的小白,初始fish-redux會對各種概念一臉懵逼,下面我們來梳理一下。

page

page代表一個頁面,繼承自 component。它由view(即展示ui的Widget)、state、reducer、effect等組成

state

state用來儲存 page/component(頁面/元件)的狀態,即存放資料

action

action是我們定義的意圖。我們需要處理某些操作或事件時,通過傳送(dispatch)特定的 action,讓對應action的接收者進行處理。

action包含兩個欄位:

  • type:action的型別
  • payload:action搭載的引數

reducer

reducer的作用是接收某個意圖(action),然後對資料做出修改,即更新狀態(state)。

effect

effect的用法跟 reducer 類似,但是責任不同。他負責處理“副作用”,這是函數語言程式設計的概念。在這裡簡單地理解為,reducer是負責(state)的更新,effect 負責 state 更新之外的事情。

store

store維持全域性的狀態(state),應用只有一個單一的 store 。

1.2 Fish-Redux流程圖

根據個人的理解,簡單地繪製了下圖 fish_redux_flow.jpg

手把手入門Fish-Redux開發flutter(上)
首先看左上:使用者進行某個操作----->然後呼叫context.dispatch方法傳送一個由ActionCreator建立的Action----->effect接收並處理,然後dispatch給reducer----->reducer接收併產生新的state----->state更新導致介面顯示的重新整理

2 引入Fish-Redux

2.1 建立專案

首先建立一個flutter專案,取名叫fish_demo

手把手入門Fish-Redux開發flutter(上)

手把手入門Fish-Redux開發flutter(上)

這是建立好的預設專案

手把手入門Fish-Redux開發flutter(上)

2.2 引入fish-redux

然後我們引入fish-redux:首先開啟pubspec.yaml檔案,在 dependencies 下面加上 fish_redux: ^0.2.7 ,點選 packages get ,最後檢視結果。 引入fish-redux

手把手入門Fish-Redux開發flutter(上)

3 安裝外掛

fish-redux團隊我們提供了一個外掛,方便我們使用fish-redux,簡化了檔案建立的過程。 外掛名字叫:FishReduxTemplate

手把手入門Fish-Redux開發flutter(上)

外掛安裝成功:

手把手入門Fish-Redux開發flutter(上)

4 建立應用的根 Widget

新建一個 app.dart 用來建立應用的根Widget。 我們定義一個createApp()方法來初始化app的資訊,包括標題、主題、頁面路由。app.dart如下


import 'package:fish_redux/fish_redux.dart';
import 'package:flutter/material.dart';

Widget createApp() {
  final AbstractRoutes routes = PageRoutes(
    pages: <String, Page<Object, dynamic>>{
    },
  );

  return MaterialApp(
    title: 'FishDemo',
    theme: ThemeData(
      primarySwatch: Colors.blue,
    ),
    onGenerateRoute: (RouteSettings settings) {
      return MaterialPageRoute<Object>(builder: (BuildContext context) {
        return routes.buildPage(settings.name, settings.arguments);
      });
    },
  );
}

複製程式碼

然後修改預設的 main.dart,讓其執行我們的app。main.dart如下

import 'package:flutter/material.dart';
import 'app.dart';

void main() => runApp(createApp());

複製程式碼

5 第一個fish-redux頁面

首先新建一個 package 命名為 entrance ,表示應用入口介面。

右鍵點選 entrance ----> New ----> FishReduxTemplate ,選擇後彈出視窗如下:

手把手入門Fish-Redux開發flutter(上)
我們採用預設勾選,並命名這個 module 為 Entrance。 然後得到的 Entrance 頁如下
手把手入門Fish-Redux開發flutter(上)

page.dart 我們可以看出一個 page 的結構。page.dart如下

import 'package:fish_redux/fish_redux.dart';
import 'effect.dart';
import 'reducer.dart';
import 'state.dart';
import 'view.dart';

class EntrancePage extends Page<EntranceState, Map<String, dynamic>> {
  EntrancePage()
      : super(
            initState: initState,
            effect: buildEffect(),
            reducer: buildReducer(),
            view: buildView,
            dependencies: Dependencies<EntranceState>(
                adapter: null,
                slots: <String, Dependent<EntranceState>>{
                }),
            middleware: <Middleware<EntranceState>>[
            ],);

}

複製程式碼

Entrance 頁面的檢視部分由 view.dart 負責,我們對其進行修改,加一個button進去。view.dart修改後如下。

import 'package:fish_redux/fish_redux.dart';
import 'package:flutter/material.dart';
import 'action.dart';
import 'state.dart';

Widget buildView(EntranceState state, Dispatch dispatch, ViewService viewService) {
  return Scaffold(
    appBar: AppBar(
      backgroundColor: Colors.blue,
      title: Text('入口頁面'),
    ),
    body: Container(
      child: Center(
        child: RaisedButton(
          padding: EdgeInsets.fromLTRB(40, 0, 40, 0),
          color: Colors.green,
          child: Text(
            "進入",
            style: TextStyle(color: Colors.white),
          ),
          onPressed: () {
            //todo 點選事件
          }),
      ),
    ),
  );
}
複製程式碼

最後我們將 Entrance 頁面配置到app全域性頁面路由中,並將其設定為 app 預設的 home 頁面。開啟 app.dart:(註釋標記的兩行)


import 'package:fish_redux/fish_redux.dart';
import 'package:flutter/material.dart';

import 'entrance/page.dart';

Widget createApp() {
  final AbstractRoutes routes = PageRoutes(
    pages: <String, Page<Object, dynamic>>{
      'entrance_page': EntrancePage(),  //在這裡新增頁面
    },
  );

  return MaterialApp(
    title: 'FishDemo',
    theme: ThemeData(
      primarySwatch: Colors.blue,
    ),
    home: routes.buildPage('entrance_page', null),  //把他作為預設頁面
    onGenerateRoute: (RouteSettings settings) {
      return MaterialPageRoute<Object>(builder: (BuildContext context) {
        return routes.buildPage(settings.name, settings.arguments);
      });
    },
  );
}

複製程式碼

執行效果如下

手把手入門Fish-Redux開發flutter(上)

下一篇將瞭解更多關於fish-redux的使用。

?如果我的內容對您有幫助,歡迎點贊、評論、轉發、收藏。

相關文章