mobile_skt/lib/util/modal.util.dart

159 lines
5.5 KiB
Dart
Raw Normal View History

2024-03-25 14:16:00 +08:00
import 'package:flutter/cupertino.dart';
2024-03-19 11:09:07 +08:00
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:sk_base_mobile/app_theme.dart';
2024-03-26 11:35:39 +08:00
import 'package:sk_base_mobile/util/screen_adaper_util.dart';
2024-04-01 08:41:52 +08:00
import 'package:sk_base_mobile/widgets/core/sk_bottomsheet_picker.dart';
2024-03-19 11:09:07 +08:00
class ModalUtil {
static Future<bool> confirm(
{String? title, String? button, VoidCallback? onConfirm}) async {
2024-03-19 11:09:07 +08:00
bool confirmed = false;
await showDialog(
context: Get.overlayContext!,
builder: (context) {
return AlertDialog(
clipBehavior: Clip.hardEdge,
backgroundColor: AppTheme.nearlyWhite,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(ScreenAdaper.sp(20)),
),
actionsPadding: EdgeInsets.symmetric(),
contentPadding: EdgeInsets.symmetric(
horizontal: ScreenAdaper.width(20),
vertical: ScreenAdaper.height(20)),
titlePadding: EdgeInsets.symmetric(),
title: title != null
? Container(
padding:
EdgeInsets.symmetric(vertical: ScreenAdaper.height(20)),
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
color: AppTheme.dividerColor,
width: ScreenAdaper.height(2)))),
alignment: Alignment.center,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.error_outline,
color: AppTheme.dangerColor,
),
SizedBox(
width: ScreenAdaper.width(10),
),
Text(
title,
style: TextStyle(
fontSize: ScreenAdaper.sp(40),
fontWeight: FontWeight.w500),
)
]),
)
: null,
// actionsAlignment: MainAxisAlignment.spaceEvenly,
2024-03-19 11:09:07 +08:00
actions: [
Row(
children: [
Expanded(
child: InkWell(
onTap: () {
Navigator.of(context).pop();
confirmed = false;
},
child: Container(
padding: EdgeInsets.symmetric(
vertical: ScreenAdaper.height(15)),
alignment: Alignment.center,
child: Text(
'取消',
style: TextStyle(
color: Colors.black, fontSize: ScreenAdaper.sp(40)),
)),
)),
VerticalDivider(),
Expanded(
child: InkWell(
onTap: () {
if (onConfirm != null) onConfirm();
Navigator.pop(context);
confirmed = true;
},
child: Container(
padding:
EdgeInsets.symmetric(vertical: ScreenAdaper.height(15)),
alignment: Alignment.center,
child: Text(
'确定',
style: TextStyle(
color: Colors.black, fontSize: ScreenAdaper.sp(40)),
),
),
)),
],
)
2024-03-19 11:09:07 +08:00
],
);
},
);
return confirmed;
}
2024-03-25 14:16:00 +08:00
/// 底部选择器支持3级
static Future<void> showBottomSheetPicker(
{title = '请选择',
required onChanged,
required firstLevel,
secondLevel,
thirdLevel,
itemHeight,
popupHeight}) async =>
showCupertinoModalPopup(
context: Get.overlayContext!,
builder: (BuildContext context) {
2024-04-01 08:41:52 +08:00
return SkBottomSheetPicker(
2024-03-25 14:16:00 +08:00
title: title,
onChanged: onChanged,
firstLevel: firstLevel,
secondLevel: secondLevel,
thirdLevel: thirdLevel,
itemHeight: itemHeight ?? 80.0,
popupHeight: popupHeight ?? 400);
},
);
2024-03-26 11:35:39 +08:00
static Future<void> showGeneralDialog(
2024-03-27 11:06:01 +08:00
{required Widget content,
double? width,
double? height,
Offset? offset}) {
2024-03-26 11:35:39 +08:00
return Get.generalDialog(
barrierLabel: "productPicker",
barrierDismissible: true,
transitionDuration: const Duration(milliseconds: 400),
pageBuilder: (_, __, ___) {
return Center(
child: ClipRRect(
borderRadius: BorderRadius.circular(ScreenAdaper.sp(30)),
child: Material(
child: SizedBox(
2024-03-26 15:30:43 +08:00
height: height ?? Get.height - ScreenAdaper.height(150),
2024-03-26 11:35:39 +08:00
width: width ?? Get.width - ScreenAdaper.width(150),
child: content,
))));
},
transitionBuilder: (_, anim, __, child) {
Tween<Offset> tween;
2024-03-27 11:06:01 +08:00
tween = Tween(begin: offset ?? const Offset(0, 1), end: Offset.zero);
2024-03-26 11:35:39 +08:00
return SlideTransition(
position: tween.animate(
CurvedAnimation(parent: anim, curve: Curves.easeInOut),
),
child: child,
);
},
);
}
2024-03-19 11:09:07 +08:00
}