138 lines
4.0 KiB
Dart
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,
|
|
});
|
|
}
|