Flutter:剝離StatefulWidget——簡(jiǎn)化頁(yè)面開(kāi)發(fā)邮破、跳轉(zhuǎn)以及傳值

伊始

前幾日一位大佬考我诈豌,說(shuō):

flutter頁(yè)面開(kāi)發(fā)需要寫(xiě)StatefulWidget和State仆救,Android只需要Activity,
如何簡(jiǎn)化這種開(kāi)發(fā)方式矫渔?

我答曰:

activity還需要寫(xiě)xml呢~

在大佬的靜默中,四周浮現(xiàn)起熱烈的掌聲......

......

深夜彤蔽,天橋下的我輾轉(zhuǎn)反側(cè)、難以入眠......

‘ 難道庙洼,真的可以顿痪? ’......

經(jīng)過(guò)反復(fù)推敲打磨后,這個(gè)‘輪子’還確實(shí)有點(diǎn)兒圓油够,‘滾’起來(lái)還挺順溜蚁袭。

天橋之下難免簡(jiǎn)陋,如有不足還請(qǐng)海涵石咬,萬(wàn)望指點(diǎn)~ 嘿嘿 

構(gòu)思

我們一般開(kāi)發(fā)頁(yè)面A揩悄,結(jié)構(gòu)如下:

class A extends StatefulWidget{
}

class AState extends State<A>{
}

同時(shí)為了解耦和對(duì)路由統(tǒng)一做控制,我們采取的頁(yè)面跳轉(zhuǎn)方式(即靜態(tài)路由)是:

Navigator.of(context).pushName('/a')

此種跳轉(zhuǎn)方式的缺點(diǎn)就是頁(yè)面?zhèn)髦敌枰猰ap形式鬼悠,不方便的同時(shí)删性,還容易輸錯(cuò)Key,就算使用注解依然無(wú)法避免焕窝。

反復(fù)觀察和思考得出了下面這樣一張結(jié)構(gòu)圖

結(jié)構(gòu)圖

image

對(duì)各模塊做一下簡(jiǎn)單介紹

BaseState

abstract class BaseState<T extends StatefulWidget> extends State<T>{}

對(duì)page和view通用功能的封裝

WidgetState

abstract class WidgetState extends BaseState with WidgetGenerator{}

對(duì)自定義view的通用功能封裝

PageState

abstract class PageState extends BaseState with WidgetGenerator,RouteAware{}

對(duì)自定義Page的通用功能封裝

RouteAware對(duì)路由觀測(cè)蹬挺,你可以埋點(diǎn)或者記錄等等

WidgetGenerator

mixin WidgetGenerator on BaseState implements _RouteGenerator,_NavigateActor{}

生成widget并為widget裝配功能

_RouteGenerator 生成Route(可帶過(guò)渡動(dòng)畫(huà))功能

  PageRoute<T> buildRoute<T>(Widget page, String routeName, {PageAnimation animation, Object args}) {
                ....
  }

_NavigateActor 路由的各種push和pop操作,你也可以拓展

  Future push<T extends PageState>(T page,{PageAnimation animation});
  Future pushAndRemoveUntil<T extends PageState>(T page,{PageAnimation animation,RoutePredicate predicate});
  Future pushReplacement<T extends Object,TO extends PageState>(TO page, {PageAnimation animation, T result });

  void pop<T extends Object>({T result,});
  void popUntil({RoutePredicate predicate});

  bool canPop();

各模塊就介紹完畢了它掂,下面介紹一下使用方法巴帮。

如何使用

頁(yè)面的開(kāi)發(fā)

當(dāng)我們需要開(kāi)發(fā)頁(yè)面A時(shí),如下:

clas A extends PageState{
   Widget build(BuildContext context){...}
}

就這么簡(jiǎn)單群发。

頁(yè)面?zhèn)髦?/h2>

當(dāng)我們想向B頁(yè)面?zhèn)饕粋€(gè)值/返回一個(gè)值到A頁(yè)面時(shí)晰韵,如下:

clas B extends PageState{
    final var value;
    B(this.value);

   Widget build(BuildContext context){...}
}

A跳到B
A頁(yè)面內(nèi):push(B('你的值'))
            .then((value)=>'B返回值=$value');

B退到A
B頁(yè)面內(nèi):pop(result:'返回給A的值');

pushAndRemoveUntil的使用

如果我從A到B到C发乔,然后C到D頁(yè)面的時(shí)候我想移除B和C熟妓,操作如下:

在C頁(yè)面

push(D(),predicate: (route)=>route.settings.name == '$A')

D頁(yè)面

當(dāng)你pop()后,你會(huì)發(fā)現(xiàn)到了A頁(yè)面

生成widget

我并不需要跳轉(zhuǎn)栏尚,但是需要將我的頁(yè)面/View生成widget,操作如下:

你的頁(yè)面/View.generateWidget({Key key}) 就可以生成一個(gè)widget了
如果需要key起愈,還可以加上一個(gè)

最后

我已經(jīng)將框架內(nèi)的Demo置換為現(xiàn)有的開(kāi)發(fā)方式,同時(shí)新增加了針對(duì)性的Demo并進(jìn)行了反復(fù)的測(cè)試译仗,總體來(lái)說(shuō)確實(shí)大幅度提升了開(kāi)發(fā)效率抬虽,避免了key值出錯(cuò)的問(wèn)題,另外在替換過(guò)程中也沒(méi)有遇到兼容性問(wèn)題纵菌,

不過(guò)這個(gè)依然算是初版阐污。

大家可以在下面的框架中使用,看看有啥不足或者bug告訴我咱圆,非常感謝笛辟。

Bedrock框架

Bedrock開(kāi)發(fā)框架

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末功氨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子手幢,更是在濱河造成了極大的恐慌捷凄,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件围来,死亡現(xiàn)場(chǎng)離奇詭異跺涤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)监透,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)桶错,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人胀蛮,你說(shuō)我怎么就攤上這事牛曹。” “怎么了醇滥?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵黎比,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我鸳玩,道長(zhǎng)阅虫,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任不跟,我火速辦了婚禮颓帝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘窝革。我一直安慰自己购城,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布虐译。 她就那樣靜靜地躺著瘪板,像睡著了一般。 火紅的嫁衣襯著肌膚如雪漆诽。 梳的紋絲不亂的頭發(fā)上侮攀,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音厢拭,去河邊找鬼兰英。 笑死,一個(gè)胖子當(dāng)著我的面吹牛供鸠,可吹牛的內(nèi)容都是我干的畦贸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼楞捂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼薄坏!你這毒婦竟也來(lái)了正林?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤颤殴,失蹤者是張志新(化名)和其女友劉穎觅廓,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體涵但,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡杈绸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了矮瘟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞳脓。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖澈侠,靈堂內(nèi)的尸體忽然破棺而出劫侧,到底是詐尸還是另有隱情,我是刑警寧澤哨啃,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布烧栋,位于F島的核電站,受9級(jí)特大地震影響拳球,放射性物質(zhì)發(fā)生泄漏审姓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一祝峻、第九天 我趴在偏房一處隱蔽的房頂上張望魔吐。 院中可真熱鬧,春花似錦莱找、人聲如沸酬姆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)辞色。三九已至,卻和暖如春谚赎,著一層夾襖步出監(jiān)牢的瞬間淫僻,已是汗流浹背诱篷。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工壶唤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棕所。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓闸盔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親琳省。 傳聞我的和親對(duì)象是個(gè)殘疾皇子迎吵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354