[英]Flutter styling unselected tab indicator
我正在嘗試在 flutter 中創建一個具有右上角和左上角邊框半徑的選項卡指示器,並設法將其應用於活動選項卡,但無法弄清楚如何將其應用於未選擇的選項卡指示器。
低於我想要達到的目標
這是我的退出代碼
setColor(int tabIndex) {
if (tabIndex == 0) {
return const Color(0xFFFBD59E);
} else if (tabIndex == 1) {
return const Color(0xFFC8E0DA);
} else if (tabIndex == 2) {
return Colors.yellow;
}
}
TabBar(
labelStyle: const TextStyle(
fontSize: 18.0, fontWeight: FontWeight.w600),
onTap: (index) {
setState(() {
tabIndex = index;
setInactiveColor(index);
});
},
controller: _controller,
tabs: const [
Tab(
text: 'Tab 1',
),
Tab(
text: 'Tab 2',
),
],
indicator: ShapeDecoration(
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topRight: Radius.circular(50),
topLeft: Radius.circular(50),
),
),
color: setColor(tabIndex),
),
),
這就是我得到的,有沒有為未選擇的標簽指示器設置樣式?
我認為沒有一種方法可以按照您想要的方式設置默認Tab
小部件的樣式,只需使用TabBar
的屬性即可。 相反,您可以為Tab
的孩子使用另一個小部件而不是Text
。
TabBar(
labelStyle: const TextStyle(fontSize: 18.0, fontWeight: FontWeight.w600),
onTap: (index) {
setState(() {
tabIndex = index;
});
},
controller: _controller,
labelPadding: EdgeInsets.zero,
tabs: [
Tab(
child: _buildTab(text: 'Tab 1', color: Colors.red),
),
Tab(
child: _buildTab(text: 'Tab 2', color: Colors.blue),
),
],
),
_buidTab 方法如下:
_buildTab({required String text, required Color color}) {
return Container(
alignment: Alignment.center,
width: double.infinity,
decoration: ShapeDecoration(
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topRight: Radius.circular(50),
topLeft: Radius.circular(50),
),
),
color: color,
),
child: Text(text),
);
}
您可以使用 TabController 知道當前選擇的選項卡這就是您可以更改選項卡顏色的方法
void initState() {
super.initState();
controller = TabController(
length: 2,
initialIndex: 1,
vsync: this,
);
controller.addListener(() {
setState(() {
activeTabIndex = controller.index;
});
});
}
查看完整代碼:-
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class StudentScreen extends StatefulWidget {
@override
_StudentScreenState createState() => _StudentScreenState();
}
class _StudentScreenState extends State<StudentScreen>
with SingleTickerProviderStateMixin {
late TabController controller;
int activeTabIndex = 1;
@override
void initState() {
super.initState();
controller = TabController(
length: 2,
initialIndex: 1,
vsync: this,
);
controller.addListener(() {
setState(() {
activeTabIndex = controller.index;
});
});
}
@override
Widget build(BuildContext context) {
return DefaultTabController(
length: 2,
child: Scaffold(
appBar: AppBar(
backgroundColor: Colors.white,
elevation: 0,
bottom: TabBar(
controller: controller,
padding: const EdgeInsets.all(0.0),
isScrollable: false,
unselectedLabelColor: Colors.black,
// indicatorPadding: EdgeInsets.zero,
// indicatorSize: TabBarIndicatorSize.label,
indicator: const BoxDecoration(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(30),
topRight: Radius.circular(30)),
// color: Color(0xFFFBD59E)
),
tabs: [
Tab(
child: Container(
decoration: BoxDecoration(
color: activeTabIndex == 0
? const Color(0xFFFBD59E)
: const Color(0xFFC8E0DA),
// color: Color(0xFFC8E0DA),
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(30),
topRight: Radius.circular(30)),
// border:
// Border.all(color: Colors.redAccent, width: 1)
),
child: const Align(
alignment: Alignment.center,
child: Text("Tab one"),
),
),
),
Tab(
child: Container(
decoration: BoxDecoration(
color: activeTabIndex == 1
? const Color(0xFFFBD59E)
: const Color(0xFFC8E0DA),
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(30),
topRight: Radius.circular(30)),
// border:
// Border.all(color: Colors.redAccent, width: 1)
),
child: const Align(
alignment: Alignment.center,
child: Text("Tab two"),
),
),
),
]),
),
body: const TabBarView(children: [
Icon(Icons.apps),
Icon(Icons.movie),
]),
));
}
}
Output
選擇的第一個選項卡
選擇了第二個選項卡
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.