showNeoSideMenu function
Future<void>
showNeoSideMenu({
- required BuildContext context,
- required List<
NeoSideMenuItem> items, - String title = 'MENU',
- double width = 304,
Implementation
Future<void> showNeoSideMenu({
required BuildContext context,
required List<NeoSideMenuItem> items,
String title = 'MENU',
double width = 304,
}) {
return showGeneralDialog<void>(
context: context,
barrierDismissible: true,
barrierLabel: title,
barrierColor: Colors.black.withValues(alpha: 0.18),
transitionDuration: const Duration(milliseconds: 340),
pageBuilder: (dialogContext, animation, secondaryAnimation) {
return Align(
alignment: Alignment.centerLeft,
child: Material(
color: Colors.transparent,
child: SafeArea(
child: Padding(
padding: const EdgeInsets.all(16),
child: SizedBox(
width: width,
child: NeoPanel(
radius: 30,
offset: NeoTokens.shadowOffset,
padding: const EdgeInsets.all(18),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
NeoPill(label: title),
const SizedBox(height: 18),
for (var index = 0; index < items.length; index++) ...[
SizedBox(
width: double.infinity,
child: NeoButton(
label: items[index].label,
icon: items[index].icon,
variant: items[index].isSelected
? NeoButtonVariant.primary
: NeoButtonVariant.secondary,
onPressed: () {
Navigator.of(dialogContext).pop();
items[index].onPressed();
},
),
),
if (index != items.length - 1)
const SizedBox(height: 12),
],
],
),
),
),
),
),
),
);
},
transitionBuilder: (context, animation, secondaryAnimation, child) {
final curved = CurvedAnimation(
parent: animation,
curve: Curves.easeOutBack,
reverseCurve: Curves.easeInCubic,
);
return FadeTransition(
opacity: animation,
child: SlideTransition(
position: Tween<Offset>(
begin: const Offset(-1, 0),
end: Offset.zero,
).animate(curved),
child: child,
),
);
},
);
}