feat: add fluttertoast localization with HarmonyOS support and ToastService

This commit is contained in:
Developer
2026-04-08 01:46:45 +08:00
parent efaff0c692
commit b9a39ed2f1
7 changed files with 490 additions and 0 deletions

View File

@@ -0,0 +1,218 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:mom_kitchen/src/standards/page_standards.dart';
enum ToastType { success, error, warning, info }
class ToastService {
static final ToastService _instance = ToastService._internal();
factory ToastService() => _instance;
ToastService._internal();
static final FToast _fToast = FToast();
static void init(BuildContext context) {
_fToast.init(context);
}
static Future<void> show({
required String message,
ToastType type = ToastType.info,
Duration duration = const Duration(seconds: 2),
ToastGravity gravity = ToastGravity.BOTTOM,
}) async {
final context = Get.context;
if (context == null) {
await _showNativeToast(message: message, type: type, gravity: gravity);
return;
}
final standards = PageStandards.of(context);
_showCustomToast(
message: message,
type: type,
duration: duration,
gravity: gravity,
standards: standards,
);
}
static Future<void> _showNativeToast({
required String message,
required ToastType type,
required ToastGravity gravity,
}) async {
Color backgroundColor;
switch (type) {
case ToastType.success:
backgroundColor = const Color(0xFF4CAF50);
break;
case ToastType.error:
backgroundColor = const Color(0xFFF44336);
break;
case ToastType.warning:
backgroundColor = const Color(0xFFFF9800);
break;
case ToastType.info:
backgroundColor = const Color(0xFF2196F3);
break;
}
await Fluttertoast.showToast(
msg: message,
toastLength: Toast.LENGTH_SHORT,
gravity: gravity,
backgroundColor: backgroundColor,
textColor: CupertinoColors.white,
fontSize: 16.0,
);
}
static void _showCustomToast({
required String message,
required ToastType type,
required Duration duration,
required ToastGravity gravity,
required PageStandards standards,
}) {
Color backgroundColor;
IconData icon;
String emoji;
switch (type) {
case ToastType.success:
backgroundColor = const Color(0xFF4CAF50);
icon = CupertinoIcons.checkmark_circle_fill;
emoji = '';
break;
case ToastType.error:
backgroundColor = const Color(0xFFF44336);
icon = CupertinoIcons.xmark_circle_fill;
emoji = '';
break;
case ToastType.warning:
backgroundColor = const Color(0xFFFF9800);
icon = CupertinoIcons.exclamationmark_triangle_fill;
emoji = '⚠️';
break;
case ToastType.info:
backgroundColor = standards.primaryColor;
icon = CupertinoIcons.info_circle_fill;
emoji = '';
break;
}
Widget toast = Container(
padding: standards.scaledPadding(
EdgeInsets.symmetric(horizontal: 20, vertical: 12),
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(standards.scaledRadius(12)),
color: backgroundColor,
boxShadow: [
BoxShadow(
color: backgroundColor.withOpacity(0.3),
blurRadius: 10,
offset: const Offset(0, 4),
),
],
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Container(
padding: standards.scaledPadding(EdgeInsets.all(4)),
decoration: BoxDecoration(
color: CupertinoColors.white.withOpacity(0.2),
borderRadius: BorderRadius.circular(standards.scaledRadius(8)),
),
child: Icon(
icon,
color: CupertinoColors.white,
size: standards.scaledFontSize(20),
),
),
SizedBox(width: standards.scaledWidth(12)),
Flexible(
child: Text(
message,
style: standards.textStyle.copyWith(
color: CupertinoColors.white,
fontWeight: FontWeight.w500,
),
),
),
],
),
);
_fToast.showToast(
child: toast,
toastDuration: duration,
gravity: gravity,
fadeDuration: const Duration(milliseconds: 300),
);
}
static Future<void> success(
String message, {
Duration duration = const Duration(seconds: 2),
ToastGravity gravity = ToastGravity.BOTTOM,
}) async {
await show(
message: message,
type: ToastType.success,
duration: duration,
gravity: gravity,
);
}
static Future<void> error(
String message, {
Duration duration = const Duration(seconds: 2),
ToastGravity gravity = ToastGravity.BOTTOM,
}) async {
await show(
message: message,
type: ToastType.error,
duration: duration,
gravity: gravity,
);
}
static Future<void> warning(
String message, {
Duration duration = const Duration(seconds: 2),
ToastGravity gravity = ToastGravity.BOTTOM,
}) async {
await show(
message: message,
type: ToastType.warning,
duration: duration,
gravity: gravity,
);
}
static Future<void> info(
String message, {
Duration duration = const Duration(seconds: 2),
ToastGravity gravity = ToastGravity.BOTTOM,
}) async {
await show(
message: message,
type: ToastType.info,
duration: duration,
gravity: gravity,
);
}
static void removeCustomToast() {
_fToast.removeCustomToast();
}
static void removeQueuedCustomToasts() {
_fToast.removeQueuedCustomToasts();
}
}