1. 程式人生 > >Flutter Widgets 之 BottomNavigationBar 和 BottomNavigationBarItem

Flutter Widgets 之 BottomNavigationBar 和 BottomNavigationBarItem

注意:無特殊說明,Flutter版本及Dart版本如下:

  • Flutter版本: 1.12.13+hotfix.5
  • Dart版本: 2.7.0

BottomNavigationBar 和 BottomNavigationBarItem配合Scaffold控制元件使用可以實現底部導航效果,類似於微信底部的導航效果,下面是一個簡單的底部導航案例:

Scaffold(
      bottomNavigationBar: BottomNavigationBar(
        items: <BottomNavigationBarItem>[
          BottomNavigationBarItem(title: Text('首頁'),icon: Icon(Icons.home)),
          BottomNavigationBarItem(title: Text('書籍'),icon: Icon(Icons.book)),
          BottomNavigationBarItem(title: Text('我的'),icon: Icon(Icons.perm_identity)),
        ],
      ),
    );

效果:

點選其他2個item時沒有反應,新增切換效果:

int _currentIndex = 0;
BottomNavigationBar(
    onTap: (int index) {
        setState(() {
            _currentIndex = index;
        });
    },
    currentIndex: _currentIndex,
    ...

currentIndex代表當前顯示導航的索引,當前切換時呼叫onTap,在onTap回撥中呼叫setState方法改變_currentIndex的值達到切換的效果。

效果如下:

BottomNavigationBar有2種顯示模式,其中一種是fixed效果,前面的展示就是fixed效果,這也是預設值,另一種是shifting效果,

BottomNavigationBar(
    type:BottomNavigationBarType.shifting,
    selectedItemColor: Theme.of(context).primaryColor,
    unselectedItemColor: Colors.black,
    ...
}

設定shifting時需要設定selectedItemColorunselectedItemColor

,效果如下:

我們還可以設定其背景顏色(backgroundColor)、圖示大小(iconSize)、選中和未選中圖示、字型的顏色,大小等。

如果導航的圖示是自己設計的圖示,這時僅僅通過BottomNavigationBar是無法實現我們想要的效果的,比如微信的導航的效果,雖然選中和未選中也是顏色的區別,但圖示不是Icons自帶的圖示,想要實現切換2個圖示需要BottomNavigationBarItem控制元件的支援,其中的iconactiveIcon分別代表未選中和選中。

通過切換導航而改變頁面是App中最常用的方式,開始構建頁面的切換:

int _currentIndex = 0;

Widget _currBody = HomePage();

_onTap(int index) {
    switch (index) {
      case 0:
        _currBody = HomePage();;
        break;
      case 1:
        _currBody = BookPage();
        break;
      case 2:
        _currBody = MyPage();
        break;
    }
    setState(() {
      _currentIndex = index;
    });
  }

Scaffold(
      body: _currBody,
      bottomNavigationBar: BottomNavigationBar(
        onTap: _onTap,
        type: BottomNavigationBarType.shifting,
        selectedItemColor: Theme.of(context).primaryColor,
        unselectedItemColor: Colors.black,
        currentIndex: _currentIndex,
        items: <BottomNavigationBarItem>[
          BottomNavigationBarItem(title: Text('首頁'), icon: Icon(Icons.home)),
          BottomNavigationBarItem(title: Text('書籍'), icon: Icon(Icons.book)),
          BottomNavigationBarItem(
              title: Text('我的'), icon: Icon(Icons.perm_identity)),
        ],
      ),
    );

Scaffold控制元件的body表示導航上面,AppBar下面的頁面,HomePage,BookPage,MyPage對應3個導航的頁面,背景分別是紅、藍、黃色,效果如下:

推薦幾款Github上帶動畫效果的底部導航

Fluid Button Bar

Icon Flip Button Bar

fancy_bottom_navigation

circular_bottom_navigation

bottom_navy_bar

titled_navigation_bar

更多相關閱讀:

  • Flutter系列文章總覽
  • Flutter Widgets 之 Expanded和Flexible
  • Flutter Widgets 之 AnimatedList
  • Flutter Widgets 之 SliverAppBar
如果這篇文章有幫助到您,希望您來個“贊”並關注我的公眾號,非常謝謝。