MVVM架構(gòu)在Flutter中的簡單實(shí)踐

寫在前面

Flutter 是 Google推出并開源的移動(dòng)應(yīng)用開發(fā)框架典蜕,主打跨平臺、高保真罗洗、高性能愉舔。開發(fā)者可以通過 Dart語言開發(fā) App,一套代碼同時(shí)運(yùn)行在 iOS 和 Android平臺伙菜。

Flutter官網(wǎng):https://flutter-io.cn

還記得18年參加上海Google開發(fā)者大會(huì)的時(shí)候轩缤,聽了一天的Flutter的介紹,之后不久1.0發(fā)布了贩绕,到現(xiàn)在1.2版本火的,F(xiàn)lutter一直都在快速的進(jìn)步著。年后我也終于開始了Flutter的深入學(xué)習(xí)淑倾,并很快有機(jī)會(huì)直接在項(xiàng)目中進(jìn)行實(shí)踐馏鹤。

如果你也是剛開始學(xué)習(xí)Flutter,推薦以下資源:

  • IDE:Android Studio 娇哆,相比VS Code 具備更多的debug工具湃累,更好的代碼提示和跳轉(zhuǎn)勃救,畢竟都是Google自家的東西。
  • 起步:編寫你的第一個(gè) Flutter App
  • 入門:Flutter In Action
  • 狀態(tài)管理:ScopeModel脱茉、redux剪芥、Bloc、Provide琴许∷胺荆可以查看Vadaski老哥的文章
  • 實(shí)踐:重構(gòu)現(xiàn)有項(xiàng)目的一個(gè)頁面榜田,并嘗試集成到原生項(xiàng)目中益兄。
  • 深入:查看源碼并知曉Flutter運(yùn)行原理。

MVVM-Flutter

項(xiàng)目架構(gòu)當(dāng)然是MVVM箭券,依舊遵循App開發(fā)架構(gòu)指南净捅。對比以前寫的MVVM-Android,發(fā)現(xiàn)有許多的共通之處辩块,將依賴替換成Flutter版本之后就是熟悉的節(jié)奏蛔六。

項(xiàng)目地址https://github.com/ditclear/mvvm_flutter

MVVM

dependencies

思想:M-V-VM各層直接通過rx銜接,配合響應(yīng)式的思想和rxdart的操作符進(jìn)行邏輯處理废亭,最后通過provide來更新視圖国章。

Code

//remote
class GithubService{
  Observable<dynamic> login()=> get("user");
}
//repo
class GithubRepo {
  final GithubService _remote;

  GithubRepo(this._remote);

  Observable login(String username, String password) {
    token = "basic " + base64Encode(utf8.encode('$username:$password'));
    return _remote.login();
  }
}
//viewmodel
class HomeViewModel extends ChangeNotifier {
  final GithubRepo _repo; //數(shù)據(jù)倉庫
  String username = ""; //賬號
  String password = ""; //密碼
  bool _loading = false; // 加載中
  String _response = ""; //響應(yīng)數(shù)據(jù)
  //...
  HomeViewModel(this._repo);

  /**
   * 調(diào)用model層的方法進(jìn)行登錄
   * doOnData : 請求成功時(shí),處理響應(yīng)數(shù)據(jù)
   * doOnError : 請求失敗時(shí)豆村,處理錯(cuò)誤
   * doOnListen : 開始時(shí)loading為true,通知ui更新
   * doOnDone : 結(jié)束時(shí)loading為false,通知ui更新
   */
  Observable login() => _repo
      .login(username, password)
      .doOnData((r) => response = r.toString())
      .doOnError((e, stacktrace) {
        if (e is DioError) {
          response = e.response.data.toString();
        }
      })
      .doOnListen(() => loading = true)
      .doOnDone(() => loading = false);
}

//view
class HomeWidget extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _HomeState(provideHomeViewModel());
  }
}
class _HomeState extends State<HomeWidget>{
   //...
  _HomeState(this._viewModel) {
    providers.provideValue(_viewModel);
  }
    
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appbar://...,
        body://...
       
        CupertinoButton(
            onPressed: _login,
            //...
         ),
         Container(
                //...
                child: Provide<HomeViewModel>(
                  builder: (BuildContext context, Widget child,
                          HomeViewModel value) =>
                      Text(value.response),
                ),
              ),
        //...
        
        );
  }
  
    
  _login()=>_viewModel.login().doOnListen(() {
      _controller.forward();
    }).doOnDone(() {
      _controller.reverse();
    }).listen((_) {
      //success
      Toast.show("login success",context,type: Toast.SUCCESS);
    }, onError: (e) {
      //error
      dispatchFailure(context, e);
    });
 
}

最后效果:

下載體驗(yàn)

寫在最后

Flutter上手還是蠻容易的液兽,大概一周的時(shí)間就能熟悉,畢竟很多東西Flutter團(tuán)隊(duì)都幫你弄好了掌动。

而且hot reload真的舒服四啰,一次編寫,兩端運(yùn)行粗恢。當(dāng)然缺點(diǎn)也是有的柑晒,比如:

  • 插件質(zhì)量較低(畢竟才起步,相信以后會(huì)完善)
  • json解析真的煩(遠(yuǎn)不如kotlin簡單,而且沒有擴(kuò)展)
  • 布局層次較多(配上flutter dev tool 眷射,在可接受范圍內(nèi))

總的來說敦迄,我愿意在Flutter上投入時(shí)間,相信也能得到相應(yīng)的回報(bào)凭迹,畢竟都9102年了,是吧?

如果你想了解更多關(guān)于MVVM苦囱、Flutter嗅绸、響應(yīng)式編程方面的知識,歡迎關(guān)注我撕彤。

你可以在以下地方找到我:

簡書:http://www.reibang.com/u/117f1cf0c556

掘金:https://juejin.im/user/582d601d2e958a0069bbe687

Github: https://github.com/ditclear

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鱼鸠,一起剝皮案震驚了整個(gè)濱河市猛拴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蚀狰,老刑警劉巖愉昆,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異麻蹋,居然都是意外死亡跛溉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門扮授,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芳室,“玉大人,你說我怎么就攤上這事刹勃】昂睿” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵荔仁,是天一觀的道長伍宦。 經(jīng)常有香客問我,道長乏梁,這世上最難降的妖魔是什么次洼? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮掌呜,結(jié)果婚禮上滓玖,老公的妹妹穿的比我還像新娘。我一直安慰自己质蕉,他們只是感情好势篡,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著模暗,像睡著了一般禁悠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上兑宇,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天碍侦,我揣著相機(jī)與錄音,去河邊找鬼隶糕。 笑死瓷产,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的枚驻。 我是一名探鬼主播濒旦,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼再登!你這毒婦竟也來了尔邓?” 一聲冷哼從身側(cè)響起晾剖,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梯嗽,沒想到半個(gè)月后齿尽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扇雕,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秒赤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年卦羡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了父泳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玻侥。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肿嘲,死狀恐怖晋南,靈堂內(nèi)的尸體忽然破棺而出嵌削,到底是詐尸還是另有隱情磷雇,我是刑警寧澤偿警,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站唯笙,受9級特大地震影響螟蒸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜崩掘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一七嫌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧苞慢,春花似錦诵原、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辑畦,卻和暖如春吗蚌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纯出。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工蚯妇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人暂筝。 一個(gè)月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓箩言,卻偏偏與公主長得像,于是被迫代替她去往敵國和親焕襟。 傳聞我的和親對象是個(gè)殘疾皇子分扎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

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