feat: add fluttertoast localization with HarmonyOS support and ToastService
This commit is contained in:
218
lib/src/services/toast_service.dart
Normal file
218
lib/src/services/toast_service.dart
Normal 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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user