11挣柬、Flutter Fish redux component實(shí)現(xiàn)登錄界面

本文主要記錄個(gè)人在學(xué)習(xí)fish redux中的component部分,通過編寫一個(gè)登錄框架來加深理解睛挚。
首先在lib下創(chuàng)建login包邪蛔,通過右鍵fish redux Template,創(chuàng)建LoginPage扎狱。
fish redux中的component是用來組成page中view的侧到,所以是不能單獨(dú)使用的,其中的用法在代碼上表現(xiàn)的很直接:

class LoginPage extends Page<LoginState, Map<String, dynamic>> {
  LoginPage()
      : super(
            initState: initState,
            effect: buildEffect(),
            reducer: buildReducer(),
            view: buildView,
            dependencies: Dependencies<LoginState>(
                adapter: null,
                slots: <String, Dependent<LoginState>>{
                  'smsComponent':
                    SmsLoginConnector() + SmsComponent(),
                  'pwdComponent':
                    PwdLoginConnector() + PwdComponent(),
                }),
            middleware: <Middleware<LoginState>>[
            ],);
}

代碼中的slots淤击,依賴于smsComponent及pwdComponent兩個(gè)子組件匠抗,通過連接器將LoginPage與SmsComponent、PwdComponent聯(lián)系起來遭贸。
看到這里戈咳,明白SmsComponent跟PwdComponent是LoginPage的子組件,在login目錄下面壕吹,按照創(chuàng)建LoginPage方式著蛙,創(chuàng)建出來兩個(gè)component——PwdComponent&SmsComponent。至此耳贬,已經(jīng)完成了login界面目錄結(jié)構(gòu)上的搭建踏堡。

loginPage結(jié)構(gòu)圖.png

然后,開始使用component來組裝頁面(page)了:
第一步咒劲,在LoginState(State文件)中顷蟆,初始化state,loginState是Loginpage的state腐魂,其中應(yīng)該包含子組件的state的初始化及創(chuàng)建聯(lián)系:

class LoginState implements Cloneable<LoginState> {
  SmsState smsState;
  PwdState pwdState;
  bool isSmsModel;

  @override
  LoginState clone() {
    return LoginState()
      ..smsState = smsState
      ..pwdState = pwdState
      ..isSmsModel=isSmsModel;
  }
}

LoginState initState(Map<String, dynamic> args) {
  return LoginState()..isSmsModel = true
  ..pwdState = PwdState(loginBtnEnable: false)//初始化pwdComponent中按鍵的狀態(tài)
  ..smsState = SmsState(loginBtnEnable: false);//初始化smsComponent中按鍵的狀態(tài)
}
//smsComponent與page的連接器
class SmsLoginConnector extends ConnOp<LoginState,SmsState>{
  @override
  SmsState get(LoginState state) {
    return state.smsState;
  }
  @override
  void set(LoginState state, SmsState subState) {
    state.smsState = subState;
  }
}
//pwdComponent與page的連接器
class PwdLoginConnector extends ConnOp<LoginState,PwdState>{
  @override
  PwdState get(LoginState state) {
    return state.pwdState;
  }
  @override
  void set(LoginState state, PwdState subState) {
    state.pwdState = subState;
  }
}

第二步帐偎,在view中引用smsComponent及pwdComponent。
通過 state中的isSmsModel來確定引用當(dāng)前那個(gè)子組件:

Widget buildView(LoginState state, Dispatch dispatch, ViewService viewService) {
  return Scaffold(
    backgroundColor: Colors.white,
    body: Container(
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
        ......
          _getLoginView(state,viewService),//引入子組件
        ],
      ),
    ),
  );
}
//判斷當(dāng)前的isSmsModel蛔屹,加載不同的組件
Widget _getLoginView(LoginState state,ViewService viewService){
  if(!state.isSmsModel){
    return Container(
      child: viewService.buildComponent('smsComponent'),
    );
  }else{
    return Container(
      child: viewService.buildComponent('pwdComponent'),
    );
  }
}

state.isSmsModel是由頁面頂部的“密碼登錄”跟“驗(yàn)證碼登錄”兩個(gè)按鍵控制的削樊,具體實(shí)現(xiàn)可以參考GitHub中的具體代碼。
第三步,實(shí)現(xiàn)驗(yàn)證碼登錄及密碼登錄的切換
在login的Action中創(chuàng)建pwdLogin漫贞,及smsLogin兩個(gè)意圖甸箱,view中的密碼登錄及驗(yàn)證碼登錄按鍵,觸發(fā)這兩個(gè)意圖迅脐,并發(fā)送(dispatch)給effect芍殖,拿到pwdLogin及smsLogin兩個(gè)意圖的effect將該意圖,再次發(fā)生(dispatch)給reducer谴蔑,然后通過reducer來更新當(dāng)前的state,并更新view豌骏。

......
LoginState _pwdLogin(LoginState state, Action action){
  final LoginState newState = state.clone();
  newState.isSmsModel = false;
  return newState;
}

第四步,完善component
component的state中包含一個(gè)bool類型的狀態(tài)loginBtnEnable隐锭,表示登錄按鈕是否可用肯适。在LoginPage state中默認(rèn)值為false。接下來是component的view:

Widget buildView(PwdState state, Dispatch dispatch, ViewService viewService) {
  return Container(
    margin: EdgeInsets.only(left: 30, top: 40, right: 30),
    child: Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: <Widget>[
        Container(
          child: TextField(
            decoration: InputDecoration(
              hintText: "請輸入手機(jī)號(hào)碼",
              hintStyle: TextStyle(color: Colors.grey[300], fontSize: 14),
              border: InputBorder.none,
            ),
            cursorColor: Color(0xFF009274),
          ),
          decoration: BoxDecoration(
              // 下滑線淺灰色成榜,寬度1像素
              border: Border(
                  bottom: BorderSide(color: Colors.grey[300], width: 0.5))),
        ),
        Stack(
          children: <Widget>[
            Container(
              margin: EdgeInsets.only(top: 20),
              child: TextField(
                decoration: InputDecoration(
                  hintText: "請輸入驗(yàn)證碼",
                  hintStyle: TextStyle(color: Colors.grey[300], fontSize: 14),
                  border: InputBorder.none,
                ),
                obscureText: true,
                cursorColor: Color(0xFF009274),
              ),
              decoration: BoxDecoration(
                // 下滑線淺灰色框舔,寬度1像素
                  border: Border(
                      bottom: BorderSide(color: Colors.grey[300], width: 0.5))),
            ),
          ......//詳細(xì)代碼,請參考Github
}

到這里赎婚,我們就完成了多個(gè)component組件組裝一個(gè)page刘绣,以上都是開發(fā)思路,具體實(shí)現(xiàn)可參考https://github.com/zjt19870816/fish_redux_login

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挣输,一起剝皮案震驚了整個(gè)濱河市纬凤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌撩嚼,老刑警劉巖停士,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異完丽,居然都是意外死亡恋技,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門逻族,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜻底,“玉大人,你說我怎么就攤上這事聘鳞”「ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵抠璃,是天一觀的道長站楚。 經(jīng)常有香客問我,道長搏嗡,這世上最難降的妖魔是什么窿春? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上谁尸,老公的妹妹穿的比我還像新娘。我一直安慰自己纽甘,他們只是感情好良蛮,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著悍赢,像睡著了一般决瞳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上左权,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天皮胡,我揣著相機(jī)與錄音,去河邊找鬼赏迟。 笑死屡贺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锌杀。 我是一名探鬼主播甩栈,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼糕再!你這毒婦竟也來了量没?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤突想,失蹤者是張志新(化名)和其女友劉穎殴蹄,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體猾担,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袭灯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绑嘹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妓蛮。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖圾叼,靈堂內(nèi)的尸體忽然破棺而出蛤克,到底是詐尸還是另有隱情,我是刑警寧澤夷蚊,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布构挤,位于F島的核電站,受9級特大地震影響惕鼓,放射性物質(zhì)發(fā)生泄漏筋现。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望矾飞。 院中可真熱鬧一膨,春花似錦、人聲如沸洒沦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽申眼。三九已至瞒津,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間括尸,已是汗流浹背巷蚪。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留濒翻,地道東北人屁柏。 一個(gè)月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像有送,于是被迫代替她去往敵國和親前联。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容