THATMobile/lib/core/components/tab/custom_tab.dart
2026-02-26 10:39:42 +07:00

138 lines
4.0 KiB
Dart

import 'package:baseproject/core/components/tab/custom_tab_widget.dart';
import 'package:baseproject/core/theme/custom_color.dart';
import 'package:flutter/material.dart';
typedef OnTabChanged = Function(int tabIndex);
class CustomTab extends StatefulWidget {
const CustomTab({
Key? key,
required this.items,
this.borderBottomColor,
this.onTabChanged,
this.indicatorColor,
this.labelStyle,
this.unselectedLabelStyle,
this.tabItemPadding,
this.tabPadding,
this.isScrollable = false,
this.isTopIcon = false,
this.backgroundColor,
this.indicatorPadding,
this.tabBarIndicatorSize,
this.alignment = Alignment.center,
this.initialIndex = 0,
this.labelColor,
this.unselectedLabelColor,
this.tabController,
this.widgetBottom,
}) : super(key: key);
final List<AppBarItemModel> items;
final Color? borderBottomColor;
final Color? backgroundColor;
final OnTabChanged? onTabChanged;
final Color? indicatorColor;
final TextStyle? labelStyle;
final TextStyle? unselectedLabelStyle;
final EdgeInsets? tabItemPadding;
final EdgeInsets? tabPadding;
final EdgeInsets? indicatorPadding;
final bool isScrollable;
final bool isTopIcon;
final Alignment alignment;
final TabBarIndicatorSize? tabBarIndicatorSize;
final int initialIndex;
final Color? labelColor;
final Color? unselectedLabelColor;
final TabController? tabController;
final Widget? widgetBottom;
@override
_CustomTabState createState() => _CustomTabState();
}
class _CustomTabState extends State<CustomTab> with TickerProviderStateMixin, AutomaticKeepAliveClientMixin {
Color get _borderBottomColor => widget.borderBottomColor ?? CustomColor.borderLight;
int get initialIndex => widget.initialIndex;
late TabController _tabController;
List<AppBarItemModel> get _items => widget.items;
EdgeInsets get _tabItemPadding => widget.tabItemPadding ?? const EdgeInsets.symmetric(vertical: 12);
EdgeInsets get _indicatorPadding => widget.indicatorPadding ?? const EdgeInsets.symmetric(horizontal: 12);
@override
void initState() {
super.initState();
_tabController =
widget.tabController ?? TabController(length: _items.length, vsync: this, initialIndex: initialIndex);
_tabController.addListener(() {
if (widget.onTabChanged != null && !_tabController.indexIsChanging) {
widget.onTabChanged!(_tabController.index);
}
});
}
@override
Widget build(BuildContext context) {
super.build(context);
return Column(
children: <Widget>[
CustomTabWidget(
items: widget.items,
borderBottomColor: widget.borderBottomColor,
onTabChanged: widget.onTabChanged,
indicatorColor: widget.indicatorColor,
labelStyle: widget.labelStyle,
unselectedLabelStyle: widget.unselectedLabelStyle,
tabItemPadding: widget.tabItemPadding,
tabPadding: widget.tabPadding,
isScrollable: widget.isScrollable,
isTopIcon: widget.isTopIcon,
backgroundColor: widget.backgroundColor,
indicatorPadding: widget.indicatorPadding,
tabBarIndicatorSize: widget.tabBarIndicatorSize,
alignment: widget.alignment,
initialIndex: widget.initialIndex,
labelColor: widget.labelColor,
unselectedLabelColor: widget.unselectedLabelColor,
tabController: _tabController,
),
widget.widgetBottom ?? const SizedBox(),
Expanded(
child: TabBarView(
controller: _tabController,
children: widget.items.map((AppBarItemModel e) => e.widget ?? const SizedBox()).toList(),
)),
],
);
}
@override
bool get wantKeepAlive => true;
}
// ignore: must_be_immutable
class AppBarItemModel {
String title;
int? itemCount;
Color? iconColor;
Color? borderColor;
Color? iconActiveColor;
Widget? widget;
int? id;
AppBarItemModel(
this.title, {
this.iconColor,
this.borderColor,
this.iconActiveColor,
this.widget,
this.id,
this.itemCount,
});
}