import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; // import 'package:fluttertoast/fluttertoast.dart'; import 'package:toastification/toastification.dart'; import 'package:universal_html/html.dart' as html; class ToastHelper { static void showSuccessToast(BuildContext context, String message) { toastification.show( context: context, type: ToastificationType.success, style: ToastificationStyle.flatColored, autoCloseDuration: const Duration(seconds: 2), title: Text(message), // you can also use RichText widget for title and description parameters // description: RichText( // text: const TextSpan(text: 'This is a sample toast message. ')), alignment: Alignment.topRight, direction: TextDirection.ltr, animationDuration: const Duration(milliseconds: 100), animationBuilder: (context, animation, alignment, child) { return FadeTransition(opacity: animation, child: child); }, icon: const Icon(Icons.check), primaryColor: Colors.green, backgroundColor: Colors.white, foregroundColor: Colors.black, padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 16), margin: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), borderRadius: BorderRadius.circular(12), boxShadow: const [ BoxShadow( color: Color(0x07000000), blurRadius: 16, offset: Offset(0, 16), spreadRadius: 0, ), ], showProgressBar: true, closeButtonShowType: CloseButtonShowType.onHover, closeOnClick: false, pauseOnHover: false, dragToClose: true, applyBlurEffect: true, callbacks: ToastificationCallbacks( onTap: (toastItem) => print('Toast ${toastItem.id} tapped'), onCloseButtonTap: (toastItem) => print('Toast ${toastItem.id} close button tapped'), onAutoCompleteCompleted: (toastItem) => print('Toast ${toastItem.id} auto complete completed'), onDismissed: (toastItem) => print('Toast ${toastItem.id} dismissed'), ), ); } static void showWarningToast(BuildContext context, String message) { toastification.show( context: context, type: ToastificationType.warning, style: ToastificationStyle.flatColored, autoCloseDuration: const Duration(seconds: 2), title: Text(message), // you can also use RichText widget for title and description parameters // description: RichText( // text: const TextSpan(text: 'This is a sample toast message. ')), alignment: Alignment.topRight, direction: TextDirection.ltr, animationDuration: const Duration(milliseconds: 100), animationBuilder: (context, animation, alignment, child) { return FadeTransition(opacity: animation, child: child); }, icon: const Icon(Icons.warning), primaryColor: Colors.amberAccent, backgroundColor: Colors.white, foregroundColor: Colors.black, padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 16), margin: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), borderRadius: BorderRadius.circular(12), boxShadow: const [ BoxShadow( color: Color(0x07000000), blurRadius: 16, offset: Offset(0, 16), spreadRadius: 0, ), ], showProgressBar: true, closeButtonShowType: CloseButtonShowType.onHover, closeOnClick: false, pauseOnHover: false, dragToClose: true, applyBlurEffect: true, callbacks: ToastificationCallbacks( onTap: (toastItem) => print('Toast ${toastItem.id} tapped'), onCloseButtonTap: (toastItem) => print('Toast ${toastItem.id} close button tapped'), onAutoCompleteCompleted: (toastItem) => print('Toast ${toastItem.id} auto complete completed'), onDismissed: (toastItem) => print('Toast ${toastItem.id} dismissed'), ), ); } static void showErrorToast(BuildContext context, String message) { toastification.show( context: context, type: ToastificationType.error, style: ToastificationStyle.flatColored, autoCloseDuration: const Duration(seconds: 2), title: Text(message), // you can also use RichText widget for title and description parameters // description: RichText( // text: const TextSpan(text: 'This is a sample toast message. ')), alignment: Alignment.topRight, direction: TextDirection.ltr, animationDuration: const Duration(milliseconds: 100), animationBuilder: (context, animation, alignment, child) { return FadeTransition(opacity: animation, child: child); }, icon: const Icon(Icons.error), primaryColor: Colors.redAccent, backgroundColor: Colors.white, foregroundColor: Colors.black, padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 16), margin: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), borderRadius: BorderRadius.circular(12), boxShadow: const [ BoxShadow( color: Color(0x07000000), blurRadius: 16, offset: Offset(0, 16), spreadRadius: 0, ), ], showProgressBar: true, closeButtonShowType: CloseButtonShowType.onHover, closeOnClick: false, pauseOnHover: false, dragToClose: true, applyBlurEffect: true, callbacks: ToastificationCallbacks( onTap: (toastItem) => print('Toast ${toastItem.id} tapped'), onCloseButtonTap: (toastItem) => print('Toast ${toastItem.id} close button tapped'), onAutoCompleteCompleted: (toastItem) => print('Toast ${toastItem.id} auto complete completed'), onDismissed: (toastItem) => print('Toast ${toastItem.id} dismissed'), ), ); // _showToast(context, message, Colors.red); } static void showInfoToast(BuildContext context, String message) { toastification.show( context: context, type: ToastificationType.info, style: ToastificationStyle.flatColored, autoCloseDuration: const Duration(seconds: 2), title: Text(message), // you can also use RichText widget for title and description parameters // description: RichText( // text: const TextSpan(text: 'This is a sample toast message. ')), alignment: Alignment.topRight, direction: TextDirection.ltr, animationDuration: const Duration(milliseconds: 100), animationBuilder: (context, animation, alignment, child) { return FadeTransition(opacity: animation, child: child); }, icon: const Icon(Icons.info), primaryColor: Colors.lightBlue, backgroundColor: Colors.white, foregroundColor: Colors.black, padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 16), margin: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), borderRadius: BorderRadius.circular(12), boxShadow: const [ BoxShadow( color: Color(0x07000000), blurRadius: 16, offset: Offset(0, 16), spreadRadius: 0, ), ], showProgressBar: true, closeButtonShowType: CloseButtonShowType.onHover, closeOnClick: false, pauseOnHover: false, dragToClose: true, applyBlurEffect: true, callbacks: ToastificationCallbacks( onTap: (toastItem) => print('Toast ${toastItem.id} tapped'), onCloseButtonTap: (toastItem) => print('Toast ${toastItem.id} close button tapped'), onAutoCompleteCompleted: (toastItem) => print('Toast ${toastItem.id} auto complete completed'), onDismissed: (toastItem) => print('Toast ${toastItem.id} dismissed'), ), ); // _showToast(context, message, Colors.red); } static void show(String message, Color backgroundColor) { if (kIsWeb) { _showWebToast(message, backgroundColor); } else { Fluttertoast.showToast( msg: message, toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.BOTTOM, backgroundColor: backgroundColor, textColor: Colors.white, fontSize: 16.0, ); } } static void _showWebToast(String message, Color backgroundColor) { // Create toast element final toast = html.DivElement() ..style.position = 'fixed' ..style.top = '20px' // Top position ..style.right = '20px' // Left position ..style.backgroundColor = _colorToRgba(backgroundColor) ..style.color = 'white' ..style.padding = '12px 24px' ..style.borderRadius = '8px' // ..style.borderColor = _colorToRgba(backgroundColor) ..style.boxShadow = '0 4px 6px rgba(0, 0, 0, 0.2)' ..style.zIndex = '9999' ..style.fontSize = '12px' ..style.fontFamily = "'Inter', sans-serif" ..style.fontWeight = '800' // Bold ..style.minWidth = '200px' ..style.maxWidth = '400px' ..style.textAlign = 'left' ..style.transition = 'all 0.3s ease-in-out' ..style.opacity = '0' ..text = message; // Add to body html.document.body?.append(toast); // Fade in animation Future.delayed(Duration(milliseconds: 10), () { toast.style.opacity = '1'; }); // Auto remove after 3 seconds Future.delayed(Duration(milliseconds: 2700), () { toast.style.opacity = '0'; }); Future.delayed(Duration(seconds: 3), () { toast.remove(); }); } static String _colorToRgba(Color color) { return 'rgba(${color.red}, ${color.green}, ${color.blue}, ${color.opacity})'; } // static void _showToast(BuildContext context, String message, Color color) { // Fluttertoast.showToast( // msg: message, // toastLength: Toast.LENGTH_SHORT, // gravity: ToastGravity.TOP, // timeInSecForIosWeb: 5, // backgroundColor: color, // textColor: Colors.white, // fontSize: 16.0, // ); // } }