Tab 标签页
代码演示
基本用法
dart
Tabs(active: "标签 1", children: [
Tab("标签 1", child: tabBox.Container(child: const Text("标签 1"))),
Tab("标签 2", child: tabBox.Container(child: const Text("标签 2"))),
Tab("标签 3", child: tabBox.Container(child: const Text("标签 3"))),
Tab("标签 4", child: tabBox.Container(child: const Text("标签 4"))),
]),
收缩布局
dart
Tabs(active: "标签 1", children: [
Tab("标签 1", child: tabBox.Container(child: const Text("标签 1"))),
Tab("标签 2", child: tabBox.Container(child: const Text("标签 2"))),
Tab("标签 3", child: tabBox.Container(child: const Text("标签 3"))),
Tab("标签 4", child: tabBox.Container(child: const Text("标签 4"))),
Tab("标签 5", child: tabBox.Container(child: const Text("标签 5"))),
Tab("标签 6", child: tabBox.Container(child: const Text("标签 6"))),
Tab("标签 7", child: tabBox.Container(child: const Text("标签 7"))),
Tab("标签 8", child: tabBox.Container(child: const Text("标签 8"))),
]),
自定义标签
dart
WithModel("1", (model) {
final title = Row(mainAxisSize: MainAxisSize.min, children: const [
Icon(VanIcons.more_o),
SizedBox(width: 5),
Text("标签")
]);
return Tabs(active: model.value, children: [
Tab(
"1",
title: title,
child: tabBox.Container(child: const Text("标签 1")),
),
Tab(
"2",
title: title,
child: tabBox.Container(child: const Text("标签 2")),
),
]);
}),
切换动画
dart
Tabs(active: "标签 1", animated: true, children: [
Tab("标签 1", child: tabBox.Container(child: const Text("标签 1"))),
Tab("标签 2", child: tabBox.Container(child: const Text("标签 2"))),
Tab("标签 3", child: tabBox.Container(child: const Text("标签 3"))),
Tab("标签 4", child: tabBox.Container(child: const Text("标签 4"))),
]),
手势滑动
dart
Tabs(active: "标签 1", swipeable: true, children: [
Tab("标签 1", child: tabBox.Container(child: const Text("标签 1"))),
Tab("标签 2", child: tabBox.Container(child: const Text("标签 2"))),
Tab("标签 3", child: tabBox.Container(child: const Text("标签 3"))),
Tab("标签 4", child: tabBox.Container(child: const Text("标签 4"))),
]),
滚动导航
dart
Builder(builder: (context) {
const len = 6;
final tabs = List.generate(len, (i) => Tab("标签 $i"));
final tabContents = List.generate(
len,
(i) => TailBox().px(10).as((s) {
return s.Container(child: Text("标签 $i 区域"));
}),
);
const contentExtent = 80.0;
final tabsKey = GlobalKey<TabsState>();
tabsState() => tabsKey.currentState;
return WithModel(ScrollController(), (model) {
final contentScroller = model.value;
return Tabs(
key: tabsKey,
children: tabs,
onChange: (e) => tabsState()?.animateToIndex(
e.index,
animateToImpl: (index, duration, curve) {
contentScroller.animateTo(
e.index * contentExtent,
duration: duration,
curve: curve,
);
},
),
builder: (_) => WithModel(ScrollController(), (model) {
return NotificationListener<ScrollNotification>(
onNotification: (e) {
final scrollIndex =
(e.metrics.pixels / contentExtent).floor();
tabsState()?.handleScrollToActiveIndexEvent(scrollIndex);
return false;
},
child: Container(
color: VanConfig.ofTheme(context).background2,
height: 100,
child: ListView(
controller: contentScroller,
itemExtent: contentExtent,
children: tabContents,
),
),
);
}),
);
});
}),
API
Props | 类型 | 描述 |
---|---|---|
shrinkTabs | bool | 收缩标签 |
active | dynamic | 当前标签,将与标签名称匹配 |
children | List<Tab> | 标签列表 |
onChange | Function({name, index}) | 标签切换触发 |
expands | bool | 布满高度 |
keepAlive | bool | 渲染所有标签 |
animated | bool | 使用切换动画 |
swipeable | bool | 允许手势切换 |
builder | Widget Function(TabState state) | 自定义绘制 |