107 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Dart
		
	
	
		
		
			
		
	
	
			107 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Dart
		
	
	
|  | import 'package:flutter/material.dart'; | ||
|  | import 'package:fluttertoast/fluttertoast.dart'; | ||
|  | 
 | ||
|  | class ToastUtil { | ||
|  |   /// 普通灰色背景提示(仅文字)
 | ||
|  |   static void showNormal(BuildContext context, String message, { | ||
|  |     ToastGravity gravity = ToastGravity.BOTTOM, | ||
|  |     int duration = 2, | ||
|  |   }) { | ||
|  |     _showToast( | ||
|  |       context: context, | ||
|  |       message: message, | ||
|  |       gravity: gravity, | ||
|  |       duration: duration, | ||
|  |     ); | ||
|  |   } | ||
|  | 
 | ||
|  |   /// 成功提示(带图标)
 | ||
|  |   static void showSuccess(BuildContext context, String message, { | ||
|  |     ToastGravity gravity = ToastGravity.CENTER, | ||
|  |     int duration = 3, | ||
|  |   }) { | ||
|  |     _showToast( | ||
|  |       context: context, | ||
|  |       message: message, | ||
|  |       gravity: gravity, | ||
|  |       duration: duration, | ||
|  |       isSuccess: true, | ||
|  |     ); | ||
|  |   } | ||
|  | 
 | ||
|  |   /// 失败提示(带图标)
 | ||
|  |   static void showError(BuildContext context, String message, { | ||
|  |     ToastGravity gravity = ToastGravity.CENTER, | ||
|  |     int duration = 4, | ||
|  |   }) { | ||
|  |     _showToast( | ||
|  |       context: context, | ||
|  |       message: message, | ||
|  |       gravity: gravity, | ||
|  |       duration: duration, | ||
|  |       isError: true, | ||
|  |     ); | ||
|  |   } | ||
|  | 
 | ||
|  |   /// 内部通用方法
 | ||
|  |   static void _showToast({ | ||
|  |     required BuildContext context, | ||
|  |     required String message, | ||
|  |     required ToastGravity gravity, | ||
|  |     required int duration, | ||
|  |     bool isSuccess = false, | ||
|  |     bool isError = false, | ||
|  |   }) { | ||
|  |     // 如果有图标(成功或失败),则使用自定义 Widget
 | ||
|  |     if (isSuccess || isError) { | ||
|  |       final fToast = FToast(); | ||
|  |       fToast.init(context); | ||
|  |       fToast.showToast( | ||
|  |         child: _buildIconToast(message, isSuccess: isSuccess), | ||
|  |         gravity: gravity, | ||
|  |         toastDuration: Duration(seconds: duration), | ||
|  |       ); | ||
|  |     } | ||
|  |     // 普通文字提示
 | ||
|  |     else { | ||
|  |       Fluttertoast.showToast( | ||
|  |         msg: message, | ||
|  |         toastLength: duration > 2 ? Toast.LENGTH_LONG : Toast.LENGTH_SHORT, | ||
|  |         gravity: gravity, | ||
|  |         backgroundColor: Colors.grey[500], | ||
|  |         textColor: Colors.white, | ||
|  |         fontSize: 16.0, | ||
|  |       ); | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   /// 构建带图标的 Toast Widget
 | ||
|  |   static Widget _buildIconToast(String message, {bool isSuccess = true}) { | ||
|  |     return Container( | ||
|  |       padding: const EdgeInsets.symmetric(horizontal: 24.0, vertical: 16.0), | ||
|  |       decoration: BoxDecoration( | ||
|  |         borderRadius: BorderRadius.circular(25.0), | ||
|  |         color: Colors.grey[850]?.withOpacity(0.9), | ||
|  |       ), | ||
|  |       child: Column( | ||
|  |         mainAxisSize: MainAxisSize.min, | ||
|  |         children: [ | ||
|  |           Icon( | ||
|  |             isSuccess ? Icons.check : Icons.error_outline, | ||
|  |             color: isSuccess ? Colors.greenAccent[400] : Colors.redAccent[400], | ||
|  |             size: 36.0, | ||
|  |           ), | ||
|  |           const SizedBox(height: 8.0), | ||
|  |           Text( | ||
|  |             message, | ||
|  |             style: const TextStyle( | ||
|  |               color: Colors.white, | ||
|  |               fontSize: 16.0, | ||
|  |             ), | ||
|  |             textAlign: TextAlign.center, | ||
|  |           ), | ||
|  |         ], | ||
|  |       ), | ||
|  |     ); | ||
|  |   } | ||
|  | } |