showSwitchAudioDialog function
Implementation
Future<void> showSwitchAudioDialog(BuildContext context, EnxController obj) async {
try {
await showModalBottomSheet(
backgroundColor: Colors.transparent,
isScrollControlled: true,
isDismissible: true, // 👈 this enables tapping outside to dismiss
enableDrag: true, // 👈 this allows swipe-down to dismiss
context: context,
builder: (BuildContext context) {
return LayoutBuilder(
builder: (context, constraints) {
final mediaQuery = MediaQuery.of(context);
final isLandscape = mediaQuery.orientation == Orientation.landscape;
final sheetWidth = isLandscape
? mediaQuery.size.width * 0.5
: mediaQuery.size.width;
return Obx(() => Padding(
padding: EdgeInsets.only(
bottom: mediaQuery.viewInsets.bottom + 120,
left: 10,
right: 10,
),
child: Align(
alignment: Alignment.bottomCenter,
child: Container(
width: sheetWidth,
constraints: BoxConstraints(
// Let content define height but prevent overflow
maxHeight: mediaQuery.size.height * (isLandscape ? 0.7 : 0.5),
),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(width: 1.0),
borderRadius: BorderRadius.circular(15.0),
),
child: ListView.builder(
shrinkWrap: true,
itemCount: obj.mediaDeviceList.length,
itemBuilder: (_, index) {
final item = obj.mediaDeviceList[index];
return RadioListTile<MediaDeviceModel>(
title: Text(
item.name,
style: const TextStyle(
color: Colors.black,
fontWeight: FontWeight.w800,
fontSize: 16,
),
),
value: item,
groupValue: obj.selectedMediaDeviceModel.value,
activeColor: Colors.red,
selected: obj.selectedMediaDeviceModel.value == item,
onChanged: (selected) {
if (selected != null) {
obj.selectedMediaDeviceModel.value = selected;
obj.selectedDevice.value = selected.name;
EnxRtc.switchMediaDevice(selected.name);
}
Get.back(); // Close modal after selection
},
);
},
),
),
),
));
},
);
},
);
} catch (e) {
// Handle errors if needed
}
}