隨著手機螢幕越做越大,對一些手比較小的使用者而言,想要單手操控手機是越來越難以實現,於是有設計師注意到這個問題,提出拇指友善的網頁設計趨勢。而且越來越多的App也漸漸朝這個方向去做設計。
很棒的是Flutter的BottomNavigationBar可以快速幫我們實現這項需求~
BottomNavigationBar也是Scaffold提供的一個Widget參數。它是App底部的導覽列,由多個項目組成,通常是3~5個項目。
我們可以為BottomNavigationBar加上一些屬性(這邊只列出幾個常用的):
List
定義按鈕外觀,賦予這些項目的名稱和圖示那接著我們就把BottomNavigationBar加入Widget裡:
bottomNavigationBar: BottomNavigationBar(
items: [
BottomNavigationBarItem(
icon: Icon(Icons.home),
title: Text('Home'),
),
...
],
currentIndex: _selectedIndex,
selectedItemColor: Colors.amber[800],
onTap: _onItemTapped,
),
我寫到這邊的時候對onTap
感到很疑惑,於是去API看官方的說明:
The stateful widget that creates the bottom navigation bar needs to keep track of the index of the selected
BottomNavigationBarItem
and callsetState
to rebuild the bottom navigation bar with the newcurrentIndex
.
在stateful widget中BottomNavigationBar需要隨時追蹤當前被選定的索引值,這時候就用到onTap
來做這件事情,onTap
會呼叫setState
去追蹤新的索引值,並讓app重新渲染新索引值的畫面。
Stateful widget:使用者可以透過點擊或其他互動方式去改變widget內容,例如:Checkbox、Radio、Slider、InkWell、Form、TextField。
Stateless widget:內容不會變的靜態widget,例如:Icon、IconButton、Text。
接著把onTap
要執行的setState
補齊:
int _selectedIndex = 0;
void _onItemTapped(int index) {
setState(() {
_selectedIndex = index;
});
}