Flutter 底部導(dǎo)航欄頁面的狀態(tài)保持

使用 Flutter 實現(xiàn)帶底部導(dǎo)航欄的 APP 主頁面辛藻,根節(jié)點使用 Scaffold邑彪,再配置 bottomNavigationBar 設(shè)置點擊事件通過調(diào)用 setState() 方法在 build 返回不同的頁面即可翘悉。但運行后會發(fā)現(xiàn)潭苞,點擊切換頁面后之前的頁面狀態(tài)無法保持,切換頁面后再切回之前的頁面惦银,頁面顯示的數(shù)據(jù)會重繪為初始狀態(tài)堕阔。這是因為 flutter 頁面默認(rèn)情況下每次都是返回的一個新的對象棍厂,重新繪制再界面的,不做任何處理的情況下自然不能保留數(shù)據(jù)超陆。要解決這個問題牺弹,有下面的三種實現(xiàn)方式:

一、Stack + OffStage + TickerMode 堆疊

簡單粗暴时呀,跟 Android 開發(fā)中在 FrameLayout 中堆疊 View张漂,再根據(jù)需要控制部分 View 的顯示于隱藏,在構(gòu)建頁面時 body 直接返回一個 Stack 對象谨娜,子 widget 即為要顯示的所有頁面:

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: Stack(children: <Widget>[
        _makePage(0),
        _makePage(1),
        _makePage(2),
        _makePage(3),
      ]),
      bottomNavigationBar: _getNavigationBar(),
    );
    
 /*
   * Stack 方式創(chuàng)建頁面
   */
  Widget _makePage(int index) {
    return Offstage(
        offstage: this._currentIndex != index,
        child: TickerMode(enabled: this._currentIndex == index, child: _pageList[index]));
  }

通過 TickerMode 的 enabled 來控制頁面是否顯示航攒,當(dāng)頁面的 index 為當(dāng)期選中的 index 時顯示否則隱藏。

二趴梢、IndexedStack 控制頁面的顯示

類似 Android 中 FragementTransManager 控制 fragement 的顯示隱藏漠畜,這與第一種方式?jīng)]有太大本質(zhì)上的區(qū)別币他,只不過是顯示判斷邏輯交給 IndexedStack 內(nèi)部自動完成,與第一種方式相比代碼量會少很多

    // IndexStack 方式
    return new Scaffold(
      body: IndexedStack(index: _currentIndex, children: _pageList),
      bottomNavigationBar: _getNavigationBar(),
    );

三盆驹、PageView

PageView 類似于 Android 中的 ViewPager 支持圆丹,頁面之間的滑動切換滩愁。這種方式需要每一個要保持狀態(tài)的 Widget 狀態(tài)管理類實現(xiàn) AutomaticKeepAliveClientMixin<Widget>,并且 wangKeepAlive 返回 true躯喇。偽代碼如下:

class WidgetState extends State<Widget>
    with AutomaticKeepAliveClientMixin<Widget> {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Widget;
  }

  @override
  // TODO: implement wantKeepAlive
  bool get wantKeepAlive => true;

這個樣 PageView 在切換時 flutter 內(nèi)部就會知道你想要保持對應(yīng)頁面的狀態(tài),在頁面切換時會將數(shù)據(jù)保留下來硝枉。這種方式是支持滑動切換頁面的

總結(jié)

不需要支持左右滑動切換頁面直接使用第二種方式實現(xiàn)導(dǎo)航欄效果廉丽,需要滑動切換頁面效果則使用第三種方式。不推薦使用第一種方式實現(xiàn)此功能
Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妻味,一起剝皮案震驚了整個濱河市正压,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌责球,老刑警劉巖焦履,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異雏逾,居然都是意外死亡嘉裤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門栖博,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屑宠,“玉大人,你說我怎么就攤上這事仇让〉浞睿” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵丧叽,是天一觀的道長卫玖。 經(jīng)常有香客問我,道長踊淳,這世上最難降的妖魔是什么骇笔? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮嚣崭,結(jié)果婚禮上笨触,老公的妹妹穿的比我還像新娘。我一直安慰自己雹舀,他們只是感情好芦劣,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著说榆,像睡著了一般虚吟。 火紅的嫁衣襯著肌膚如雪寸认。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天串慰,我揣著相機(jī)與錄音偏塞,去河邊找鬼。 笑死邦鲫,一個胖子當(dāng)著我的面吹牛灸叼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播庆捺,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼古今,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了滔以?” 一聲冷哼從身側(cè)響起捉腥,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎你画,沒想到半個月后抵碟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡坏匪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年拟逮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剥槐。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡唱歧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出粒竖,到底是詐尸還是另有隱情颅崩,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布蕊苗,位于F島的核電站沿后,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏朽砰。R本人自食惡果不足惜尖滚,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瞧柔。 院中可真熱鬧漆弄,春花似錦、人聲如沸造锅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哥蔚。三九已至倒谷,卻和暖如春蛛蒙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背渤愁。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工牵祟, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抖格。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓诺苹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親他挎。 傳聞我的和親對象是個殘疾皇子筝尾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

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