You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
3.5 KiB
Dart
114 lines
3.5 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:hmg_patient_app_new/core/app_assets.dart';
|
|
import 'package:hmg_patient_app_new/core/app_export.dart';
|
|
import 'package:hmg_patient_app_new/core/utils/utils.dart';
|
|
import 'package:hmg_patient_app_new/extensions/int_extensions.dart';
|
|
import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
|
|
import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
|
|
|
|
class CustomTabBarModel {
|
|
String? image;
|
|
String title;
|
|
|
|
CustomTabBarModel(this.image, this.title);
|
|
}
|
|
|
|
class CustomTabBar extends StatefulWidget {
|
|
final int initialIndex = 0;
|
|
final List<CustomTabBarModel> tabs;
|
|
final Color activeTextColor;
|
|
final Color activeBackgroundColor;
|
|
final Color inActiveTextColor;
|
|
final Color inActiveBackgroundColor;
|
|
final Function(int)? onTabChange;
|
|
|
|
CustomTabBar(
|
|
{Key? key,
|
|
required this.tabs,
|
|
this.activeTextColor = const Color(0xff2E3039),
|
|
this.inActiveTextColor = const Color(0xff898A8D),
|
|
this.activeBackgroundColor = const Color(0x142E3039),
|
|
this.inActiveBackgroundColor = Colors.white,
|
|
this.onTabChange})
|
|
: super(key: key);
|
|
|
|
@override
|
|
_CustomTabBarState createState() {
|
|
return _CustomTabBarState();
|
|
}
|
|
}
|
|
|
|
class _CustomTabBarState extends State<CustomTabBar> {
|
|
int selectedIndex = 0;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
super.dispose();
|
|
}
|
|
|
|
void callBackCurrentIndex() {
|
|
if (widget.onTabChange != null) widget.onTabChange!(selectedIndex);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
late Widget parentWidget;
|
|
|
|
if (widget.tabs.length > 3) {
|
|
parentWidget = ListView.separated(
|
|
scrollDirection: Axis.horizontal,
|
|
padding: EdgeInsets.zero,
|
|
physics: const BouncingScrollPhysics(),
|
|
itemBuilder: (cxt, index) => myTab(widget.tabs[index], index),
|
|
separatorBuilder: (cxt, index) => 4.width,
|
|
itemCount: widget.tabs.length,
|
|
);
|
|
} else {
|
|
parentWidget = Row(
|
|
spacing: 4,
|
|
children: [for (int i = 0; i < widget.tabs.length; i++) myTab(widget.tabs[i], i).expanded],
|
|
);
|
|
}
|
|
|
|
return Container(
|
|
height: 62.h,
|
|
padding: EdgeInsets.all(4),
|
|
decoration: BoxDecoration(
|
|
color: Colors.white,
|
|
borderRadius: BorderRadius.circular(11),
|
|
),
|
|
child: parentWidget);
|
|
}
|
|
|
|
Widget myTab(CustomTabBarModel tabBar, int currentIndex) {
|
|
bool isSelected = selectedIndex == currentIndex;
|
|
return Container(
|
|
height: 54.h,
|
|
padding: EdgeInsets.only(top: 4, bottom: 4, left: 16, right: 16),
|
|
alignment: Alignment.center,
|
|
decoration: BoxDecoration(
|
|
color: isSelected ? widget.activeBackgroundColor : widget.inActiveBackgroundColor,
|
|
borderRadius: BorderRadius.circular(7),
|
|
),
|
|
child: Row(
|
|
mainAxisSize: MainAxisSize.min,
|
|
spacing: 4,
|
|
children: [
|
|
if (tabBar.image != null) Utils.buildSvgWithAssets(icon: tabBar.image!, height: 18, width: 18, iconColor: isSelected ? widget.activeTextColor : widget.inActiveTextColor),
|
|
tabBar.title
|
|
.toText16(weight: isSelected ? FontWeight.w600 : FontWeight.w500, color: isSelected ? widget.activeTextColor : widget.inActiveTextColor, letterSpacing: isSelected ? -0.3 : -0.1),
|
|
],
|
|
)).onPress(() {
|
|
setState(() {
|
|
selectedIndex = currentIndex;
|
|
});
|
|
callBackCurrentIndex();
|
|
});
|
|
}
|
|
}
|