show method
Displays the dialog and returns the selected item.
If loadingDialog is provided, it will be displayed while fetching items. Returns null if no item is selected or fetching items fails.
Implementation
Future<T?> show(BuildContext context) async {
LoadingDialog loadingDialog = this.loadingDialog ??
LoadingDialog(message: loadingMessage ?? 'Fetching Data');
loadingDialog.show(context);
List<T>? items = await asyncItems.call();
if (context.mounted) loadingDialog.dismiss(context);
if (context.mounted && items != null) {
Size screenSize = MediaQuery.of(context).size;
bool isPortrait =
MediaQuery.of(context).orientation == Orientation.portrait;
return await showDialog<T>(
context: context,
barrierDismissible: barrierDismissible,
builder: (context) {
return Center(
child: Material(
elevation: elevation,
borderRadius: BorderRadius.circular(dialogBorderRadius),
child: ConstrainedBox(
constraints: BoxConstraints(
maxWidth: dialogWidth ??
(isPortrait ? screenSize.width : screenSize.height) *
0.85,
minWidth: dialogWidth ??
(isPortrait ? screenSize.width : screenSize.height) *
0.85,
maxHeight: dialogHeight ??
(isPortrait ? screenSize.height : screenSize.width) *
0.85,
),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (title != null || titleWidget != null || showCloseIcon)
titleWidget ??
Container(
height: titleHeight,
padding: EdgeInsets.only(
left: showCloseIcon ? 2.0 : 20.0,
right: 20.0,
),
decoration: BoxDecoration(
color: titleBackgroundColor ??
Theme.of(context).colorScheme.primary,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(dialogBorderRadius),
topRight: Radius.circular(dialogBorderRadius),
),
),
alignment: Alignment.centerLeft,
child: Row(
children: [
if (showCloseIcon)
IconButton(
onPressed: () =>
Navigator.of(context).pop(),
icon: const Icon(
Icons.clear,
color: Colors.white,
),
),
if (showCloseIcon) const SizedBox(width: 5.0),
if (title != null)
Expanded(
child: Text(
title!,
style: titleStyle ??
Theme.of(context)
.textTheme
.headlineMedium
?.copyWith(
color: Colors.white,
),
),
),
],
),
),
Flexible(
fit: FlexFit.loose,
child: ListView.builder(
shrinkWrap: true,
itemCount: items.length,
itemBuilder: (context, index) {
return Padding(
padding: const EdgeInsets.symmetric(
horizontal: 20.0, vertical: 3.0),
child: InkWell(
borderRadius: BorderRadius.circular(8.0),
onTap: () =>
Navigator.of(context).pop(items[index]),
child: Container(
width: double.infinity,
padding: const EdgeInsets.symmetric(
horizontal: 10.0),
child: itemBuilder.call(
context, items[index], index),
),
),
);
},
),
),
if (dialogButton?.positiveButton != null ||
dialogButton?.negativeButton != null)
Padding(
padding: const EdgeInsets.all(20.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
if (dialogButton!.negativeButton != null)
Flexible(
fit: FlexFit.loose,
child: InkWell(
onTap:
dialogButton!.onNegativeButtonPressed ??
() => Navigator.of(context).pop(),
child: dialogButton!.negativeButton!,
),
),
const SizedBox(width: 10.0),
if (dialogButton!.positiveButton != null)
Flexible(
fit: FlexFit.loose,
child: InkWell(
onTap:
dialogButton!.onPositiveButtonPressed ??
() => Navigator.of(context).pop(),
child: dialogButton!.positiveButton!,
),
),
],
),
),
],
),
),
),
);
},
);
}
return null;
}