managed the dropdown menu display

This commit is contained in:
Vaibhav Surve 2025-08-06 16:30:34 +05:30
parent 754f919cdc
commit a5058cd0bc

View File

@ -39,7 +39,9 @@ class _AddExpenseBottomSheet extends StatefulWidget {
class _AddExpenseBottomSheetState extends State<_AddExpenseBottomSheet> { class _AddExpenseBottomSheetState extends State<_AddExpenseBottomSheet> {
final AddExpenseController controller = Get.put(AddExpenseController()); final AddExpenseController controller = Get.put(AddExpenseController());
final GlobalKey _projectDropdownKey = GlobalKey();
final GlobalKey _expenseTypeDropdownKey = GlobalKey();
final GlobalKey _paymentModeDropdownKey = GlobalKey();
void _showEmployeeList() async { void _showEmployeeList() async {
await showModalBottomSheet( await showModalBottomSheet(
context: context, context: context,
@ -66,9 +68,12 @@ class _AddExpenseBottomSheetState extends State<_AddExpenseBottomSheet> {
List<T> options, List<T> options,
String Function(T) getLabel, String Function(T) getLabel,
ValueChanged<T> onSelected, ValueChanged<T> onSelected,
GlobalKey triggerKey, // add this param
) async { ) async {
final button = context.findRenderObject() as RenderBox; final RenderBox button =
final overlay = Overlay.of(context).context.findRenderObject() as RenderBox; triggerKey.currentContext!.findRenderObject() as RenderBox;
final RenderBox overlay =
Overlay.of(context).context.findRenderObject() as RenderBox;
final position = button.localToGlobal(Offset.zero, ancestor: overlay); final position = button.localToGlobal(Offset.zero, ancestor: overlay);
final selected = await showMenu<T>( final selected = await showMenu<T>(
@ -76,7 +81,7 @@ class _AddExpenseBottomSheetState extends State<_AddExpenseBottomSheet> {
position: RelativeRect.fromLTRB( position: RelativeRect.fromLTRB(
position.dx, position.dx,
position.dy + button.size.height, position.dy + button.size.height,
position.dx + button.size.width, overlay.size.width - position.dx - button.size.width,
0, 0,
), ),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
@ -119,7 +124,9 @@ class _AddExpenseBottomSheetState extends State<_AddExpenseBottomSheet> {
controller.globalProjects.toList(), controller.globalProjects.toList(),
(p) => p, (p) => p,
(val) => controller.selectedProject.value = val, (val) => controller.selectedProject.value = val,
_projectDropdownKey, // pass the relevant GlobalKey here
), ),
dropdownKey: _projectDropdownKey, // pass key also here
), ),
MySpacing.height(16), MySpacing.height(16),
_buildDropdown<ExpenseTypeModel>( _buildDropdown<ExpenseTypeModel>(
@ -132,7 +139,9 @@ class _AddExpenseBottomSheetState extends State<_AddExpenseBottomSheet> {
controller.expenseTypes.toList(), controller.expenseTypes.toList(),
(e) => e.name, (e) => e.name,
(val) => controller.selectedExpenseType.value = val, (val) => controller.selectedExpenseType.value = val,
_expenseTypeDropdownKey,
), ),
dropdownKey: _expenseTypeDropdownKey,
), ),
if (controller.selectedExpenseType.value?.noOfPersonsRequired == if (controller.selectedExpenseType.value?.noOfPersonsRequired ==
true) true)
@ -172,7 +181,9 @@ class _AddExpenseBottomSheetState extends State<_AddExpenseBottomSheet> {
controller.paymentModes.toList(), controller.paymentModes.toList(),
(p) => p.name, (p) => p.name,
(val) => controller.selectedPaymentMode.value = val, (val) => controller.selectedPaymentMode.value = val,
_paymentModeDropdownKey,
), ),
dropdownKey: _paymentModeDropdownKey,
), ),
MySpacing.height(16), MySpacing.height(16),
_SectionTitle( _SectionTitle(
@ -313,13 +324,18 @@ class _AddExpenseBottomSheetState extends State<_AddExpenseBottomSheet> {
required bool requiredField, required bool requiredField,
required String value, required String value,
required VoidCallback onTap, required VoidCallback onTap,
required GlobalKey dropdownKey, // new param
}) { }) {
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
_SectionTitle(icon: icon, title: title, requiredField: requiredField), _SectionTitle(icon: icon, title: title, requiredField: requiredField),
MySpacing.height(6), MySpacing.height(6),
_DropdownTile(title: value, onTap: onTap), _DropdownTile(
key: dropdownKey, // Pass the key here
title: value,
onTap: onTap,
),
], ],
); );
} }
@ -415,7 +431,8 @@ class _DropdownTile extends StatelessWidget {
const _DropdownTile({ const _DropdownTile({
required this.title, required this.title,
required this.onTap, required this.onTap,
}); Key? key, // Add optional key parameter
}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {