中提供了一些基本属性,TabBar但在您的用例中还不够。您必须创建一个TabController和一个索引变量。每当切换发生时,TabController必须设置标签的索引和背景,需要根据该索引进行设置。
编辑我的代码以更优化边界半径的答案
示例代码
class _TabDemoState extends State<TabDemo> with SingleTickerProviderStateMixin {
TabController _tabController;
int _selectedTab = 0;
@override
void initState() {
super.initState();
_tabController = TabController(vsync: this, length: 3);
_tabController.addListener((){
if (!_tabController.indexIsChanging){
setState(() {
_selectedTab = _tabController.index;
});
}
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Tab Demo"),
),
backgroundColor: Colors.white,
body: DefaultTabController(
length: 3,
child: Column(
children: <Widget>[
Material(
color: Colors.grey.shade300,
child: TabBar(
unselectedLabelColor: Colors.blue,
labelColor: Colors.blue,
indicatorColor: Colors.white,
controller: _tabController,
labelPadding: const EdgeInsets.all(0.0),
tabs: [
_getTab(0, Icon(Icons.directions_car)),
_getTab(1, Icon(Icons.directions_transit)),
_getTab(2, Icon(Icons.directions_bike)),
],
),
),
Expanded(
child: TabBarView(
physics: NeverScrollableScrollPhysics(),
controller: _tabController,
children: [
Icon(Icons.directions_car),
Icon(Icons.directions_transit),
Icon(Icons.directions_bike),
],
),
),
],
)),
);
}
_getTab(index, child) {
return Tab(
child: SizedBox.expand(
child: Container(
child: child,
decoration: BoxDecoration(
color:
(_selectedTab == index ? Colors.white : Colors.grey.shade300),
borderRadius: _generateBorderRadius(index)),
),
),
);
}
_generateBorderRadius(index) {
if ((index + 1) == _selectedTab)
return BorderRadius.only(bottomRight: Radius.circular(10.0));
else if ((index - 1) == _selectedTab)
return BorderRadius.only(bottomLeft: Radius.circular(10.0));
else
return BorderRadius.zero;
}
}
Run Code Online (Sandbox Code Playgroud)
注意- 在这方面我遇到了一个问题。当您从左到右快速滑动时,_tabContoller值首先返回两个值,它为您提供的index-2值比index-1预期的值高。我不知道为什么会发生这种情况,但要解决此问题,我必须禁用TabBarView.
| 归档时间: |
|
| 查看次数: |
2346 次 |
| 最近记录: |