hi-client/lib/app/widgets/dialogs/kr_update_dialog.dart
2025-10-13 18:08:02 +08:00

168 lines
4.6 KiB
Dart
Executable File

import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:kaer_with_panels/app/widgets/kr_local_image.dart';
import '../../localization/app_translations.dart';
class KRUpdateDialog extends StatelessWidget {
final String version;
final String updateContent;
final VoidCallback? onConfirm;
final VoidCallback? onCancel;
final bool showCancelButton;
final bool isForceUpdate;
KRUpdateDialog({
Key? key,
required this.version,
String? updateContent,
this.onConfirm,
this.onCancel,
this.showCancelButton = true,
this.isForceUpdate = false,
}) : updateContent = updateContent ?? AppTranslations.kr_update.defaultContent,
super(key: key);
static Future<void> show({
required String version,
String? updateContent,
VoidCallback? onConfirm,
VoidCallback? onCancel,
bool showCancelButton = true,
bool isForceUpdate = false,
}) {
return Get.dialog(
KRUpdateDialog(
version: version,
updateContent: updateContent,
onConfirm: onConfirm,
onCancel: onCancel,
showCancelButton: showCancelButton,
isForceUpdate: isForceUpdate,
),
barrierDismissible: false,
);
}
Widget _buildConfirmButton(ThemeData theme) {
return Container(
width: double.infinity,
height: 44.h,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(22.r),
gradient: const LinearGradient(
colors: [Color(0xFF2196F3), Color(0xFF1E88E5)],
),
),
child: TextButton(
onPressed: () {
if (!isForceUpdate) {
Get.back();
}
onConfirm?.call();
},
style: TextButton.styleFrom(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(22.r),
),
padding: EdgeInsets.zero,
),
child: Text(
AppTranslations.kr_update.updateNow,
style: theme.textTheme.titleMedium?.copyWith(
color: Colors.white,
fontWeight: FontWeight.w500,
fontSize: 16.sp,
),
),
),
);
}
Widget _buildCancelButton(ThemeData theme) {
return TextButton(
onPressed: () {
Get.back();
onCancel?.call();
},
style: TextButton.styleFrom(
padding: EdgeInsets.zero,
),
child: Text(
AppTranslations.kr_update.updateLater,
style: theme.textTheme.bodyMedium?.copyWith(
color: theme.hintColor,
fontSize: 14.sp,
),
),
);
}
@override
Widget build(BuildContext context) {
final ThemeData theme = Theme.of(context);
return Dialog(
backgroundColor: theme.cardColor,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12.r),
),
child: Container(
width: 280.w,
padding: EdgeInsets.all(24.w),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
KrLocalImage(
imageName: 'vs_update',
width: 190.w,
height: 98.w,
imageType: ImageType.svg,
),
SizedBox(height: 16.h),
Text(
AppTranslations.kr_update.title,
style: theme.textTheme.titleLarge?.copyWith(
fontWeight: FontWeight.w600,
fontSize: 18.sp,
color: theme.brightness == Brightness.light
? const Color(0xFF333333)
: theme.textTheme.titleLarge?.color,
),
),
SizedBox(height: 4.h),
Text(
'V$version',
style: theme.textTheme.bodyMedium?.copyWith(
color: theme.hintColor,
fontSize: 14.sp,
),
),
SizedBox(height: 1.h),
Container(
constraints: BoxConstraints(maxHeight: 120.h),
child: SingleChildScrollView(
child: Text(
updateContent,
style: theme.textTheme.bodyMedium?.copyWith(
color: theme.hintColor,
fontSize: 14.sp,
height: 1.5,
),
),
),
),
SizedBox(height: 20.h),
_buildConfirmButton(theme),
if (showCancelButton) ...[
SizedBox(height: 12.h),
_buildCancelButton(theme),
],
],
),
),
);
}
}