Flutter的開發(fā)規(guī)范

一次企、頁(yè)面Page規(guī)范前后效果對(duì)比

我們先從頁(yè)面開始(以登錄頁(yè)的優(yōu)化為例)醋火,然后逐步的從點(diǎn)到面鋪開描述悠汽。

目標(biāo):頁(yè)面布局箱吕、控件定義、事件處理分離柿冲。

1茬高、演示的Page的UI圖

用戶名登錄的UI圖

2、規(guī)范前的效果

規(guī)范前:未進(jìn)行任何處理的時(shí)候假抄,你的代碼是這樣的怎栽。

LoginPage_widgetUnsplit.jpg

3、規(guī)范后的效果

規(guī)范后**:按規(guī)范處理后你代碼的效果是這樣的宿饱,

LoginPage_widgetSplit.jpg

可見(jiàn)通過(guò)處理后Page的整體代碼更加簡(jiǎn)潔了熏瞄。

二、頁(yè)面Page開發(fā)規(guī)范的細(xì)則

1谬以、規(guī)范一:將每個(gè)Widget的定義整理到單獨(dú)的函數(shù)里

寫:

Flutter規(guī)范_Widget_right.jpg

不寫:

Flutter規(guī)范_Widget_wrong.jpg

2强饮、規(guī)范二:將各個(gè)Widget組成界面的布局放到widgets()方法里處理

寫法如下:

Flutter規(guī)范_Widgets布局_right.jpg

如此通過(guò)以上兩步后,Widget build中的代碼即會(huì)變?yōu)槿缦拢?/p>

Flutter規(guī)范_WidgetBuild_right.jpg

如此通過(guò)以上幾個(gè)拆分为黎,我們的Page頁(yè)面就顯得很簡(jiǎn)潔和很好維護(hù)了邮丰。

3、規(guī)范三铭乾、Widget的封裝

細(xì)心的你剪廉,可能發(fā)現(xiàn)了我們這里有一個(gè)系統(tǒng)沒(méi)有的LoginTextField文本框類。是的炕檩,該類是我們自定義封裝到Package后來(lái)使用的斗蒋。

對(duì)于一個(gè)控件怎么封裝,詳情查看之前的文章《Flutter進(jìn)階(2):控件Widget的自定義與封裝》

三笛质、頁(yè)面Page規(guī)范小結(jié)

  • 1吹泡、Widget build方法

build方法里盡量用最少的代碼實(shí)現(xiàn)整體視圖。如下经瓷,我們將登錄頁(yè)中的所有Widget通過(guò)loginWidgets()函數(shù)封裝起來(lái)爆哑。

  • 2、各個(gè)Widget組成的視圖布局

loginWidgets()方法里實(shí)現(xiàn)頁(yè)面Widgets的布局舆吮。而對(duì)于Widget的定義為了不讓頁(yè)面布局控件定義因?qū)懺谝欢呀页斐纱a一大坨。我們對(duì)每個(gè)Widget單獨(dú)提供定義的函數(shù)色冀,如userNameTextField()即為定義用戶文本框的函數(shù)潭袱。

  • 3、抽離每個(gè)Widget的定義

  • 4锋恬、封裝單個(gè)Widget

四屯换、業(yè)務(wù)邏輯的開發(fā)規(guī)范

說(shuō)完了頁(yè)面上的Widgets的開發(fā)規(guī)范,下面就輪到頁(yè)面上的業(yè)務(wù)邏輯的開發(fā)規(guī)范了。

拿登錄頁(yè)需要獲取上次登錄的賬號(hào)來(lái)說(shuō)彤悔,它的業(yè)務(wù)是getDefaultLoginAccountAction嘉抓,下面以混編時(shí)候的項(xiàng)目為例

1、未去解耦業(yè)務(wù)時(shí)候的登錄頁(yè)

getDefaultLoginAccountAction在Page中的實(shí)現(xiàn)一般為:

/// LoginPage.dart 中的業(yè)務(wù)代碼
  static const callNativeMethodChannel = const MethodChannel('com.dvlproad.ciyouzen/callNativeLoginMethodChannel');
  Future<Null> _getDefaultLoginAccountAction() async {
    try {
      final Map nativeResponse = await callNativeMethodChannel.invokeMethod('getDefaultLoginAccountAction');
      final Map nativeResult = callNativeNativeResult(nativeResponse);

      setState(() {
        userName = nativeResult["userName"];
        password = nativeResult["password"];
        print(userName + ":" + password);
        _usernameController.text = userName;
        _passwordController.text = password;
      });
    } on PlatformException {}
  }

相應(yīng)的它的調(diào)用為:

/// LoginPage.dart 未去解耦時(shí)候的登錄頁(yè)
class MyLoginPage extends StatefulWidget {
  MyLoginPage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyLoginPageState createState() => _MyLoginPageState();
}

class _MyLoginPageState extends State<MyLoginPage> {
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    print("Login Page initState");

    _getDefaultLoginAccountAction();
  }
  
  // other things
}

可見(jiàn)上述的業(yè)務(wù)處理getDefaultLoginAccountAction中晕窑,摻雜了對(duì)頁(yè)面Page的setState操作抑片,這不適合我們以后只對(duì)業(yè)務(wù)或者只對(duì)頁(yè)面做修改的處理。所以下面我們將它們解耦杨赤。

2敞斋、解耦業(yè)務(wù)時(shí)候的登錄頁(yè)

[圖片上傳失敗...(image-1a7cf4-1552384194828)]

getDefaultLoginAccountAction在ChannelModel中的實(shí)現(xiàn)一般為:

/// LoginChannelModel.dart 文件
Future<Map<String, dynamic>> getDefaultLoginAccountAction() async {
  try {
    final Map nativeResponse = await callNativeMethodChannel.invokeMethod('getDefaultLoginAccountAction');
    final Map nativeResult = callNativeNativeResult(nativeResponse);

    return nativeResult;
  } on PlatformException {
    return null;
  }
}

相應(yīng)的它的調(diào)用為:

/// LoginPage.dart 解耦時(shí)候的登錄頁(yè)
class MyLoginPage extends StatefulWidget {
  MyLoginPage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyLoginPageState createState() => _MyLoginPageState();
}

class _MyLoginPageState extends State<MyLoginPage> {
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    print("Login Page initState");

    getDefaultLoginAccountAction().then((nativeResult){
      setState(() {
        userName = nativeResult["userName"];
        password = nativeResult["password"];
        print(userName + ":" + password);
        _usernameController.text = userName;
        _passwordController.text = password;
      });
    });
  }
  
  // other things
}

五、Flutter Channel的數(shù)據(jù)規(guī)范

在使用Flutter與原生項(xiàng)目混編的時(shí)候疾牲,因?yàn)樯婕暗綌?shù)據(jù)傳輸植捎,所以我們有必要在前期就對(duì)傳輸數(shù)據(jù)的進(jìn)行規(guī)范統(tǒng)一。
此步略阳柔。

結(jié)束語(yǔ)

時(shí)間倉(cāng)促鸥跟,后續(xù)會(huì)再完善。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末盔沫,一起剝皮案震驚了整個(gè)濱河市医咨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌架诞,老刑警劉巖拟淮,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異谴忧,居然都是意外死亡很泊,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門沾谓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)委造,“玉大人,你說(shuō)我怎么就攤上這事均驶』枵祝” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵妇穴,是天一觀的道長(zhǎng)爬虱。 經(jīng)常有香客問(wèn)我,道長(zhǎng)腾它,這世上最難降的妖魔是什么跑筝? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮瞒滴,結(jié)果婚禮上曲梗,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好虏两,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布愧旦。 她就那樣靜靜地躺著,像睡著了一般碘举。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上搁廓,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天引颈,我揣著相機(jī)與錄音,去河邊找鬼境蜕。 笑死蝙场,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的粱年。 我是一名探鬼主播售滤,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼台诗!你這毒婦竟也來(lái)了完箩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拉队,失蹤者是張志新(化名)和其女友劉穎弊知,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粱快,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秩彤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了事哭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漫雷。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鳍咱,靈堂內(nèi)的尸體忽然破棺而出降盹,到底是詐尸還是另有隱情,我是刑警寧澤谤辜,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布澎现,位于F島的核電站,受9級(jí)特大地震影響每辟,放射性物質(zhì)發(fā)生泄漏剑辫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一渠欺、第九天 我趴在偏房一處隱蔽的房頂上張望妹蔽。 院中可真熱鬧,春花似錦、人聲如沸胳岂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)乳丰。三九已至掌测,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間产园,已是汗流浹背汞斧。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留什燕,地道東北人粘勒。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像屎即,于是被迫代替她去往敵國(guó)和親庙睡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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