Flutter Toast 封装
fluttertoast: ^8.2.4
main.dart
class AppRoute {
static final GlobalKey<NavigatorState> navigatorKey =
GlobalKey<NavigatorState>();
}
Future<void> main() async {
runApp(GetMaterialApp(
builder: FToastBuilder(),
navigatorKey: AppRoute.navigatorKey,
));
}
fluttertoast.dart
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:get/get.dart';
import 'package:guettoolbox/generated/locales.g.dart';
import 'package:guettoolbox/ui/route.dart';
final FToast fToast = FToast();
bool _isInit = false;
void toast(dynamic message) {
if (!initFToast()) return;
final toast = ToastWidget(
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Flexible(child: Text(message.toString())),
],
));
fToast.showToast(
child: toast,
gravity: ToastGravity.BOTTOM,
toastDuration: Duration(seconds: 2),
);
}
bool initFToast() {
if (!_isInit) {
final context = AppRoute.navigatorKey.currentContext;
if (context == null) {
return false;
}
fToast.init(context);
_isInit = true;
}
return true;
}
void toastSuccess({dynamic message}) {
if (!initFToast()) return;
message ??= LocaleKeys.successful.tr;
final toast = ToastWidget(
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(Icons.check, color: Colors.green),
SizedBox(width: 12.0),
Flexible(child: Text(message.toString())),
],
));
fToast.showToast(
child: toast,
gravity: ToastGravity.BOTTOM,
toastDuration: Duration(seconds: 2),
);
}
void toastFailure({dynamic message, error}) {
if (!initFToast()) return;
message ??= LocaleKeys.failed.tr;
final toast = ToastWidget(
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(Icons.clear, color: Colors.red),
SizedBox(width: 12.0),
Flexible(child: Text("${message}${error != null ? ": ${error}" : ""}")),
],
));
fToast.showToast(
child: toast,
gravity: ToastGravity.BOTTOM,
toastDuration: Duration(seconds: 2),
);
}
class ToastWidget extends StatelessWidget {
final Widget child;
const ToastWidget({
super.key,
required this.child,
});
@override
Widget build(BuildContext context) {
return Material(
borderRadius: BorderRadius.all(Radius.circular(12)),
elevation: 2,
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 24.0, vertical: 12.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
color: Colors.white,
),
child: child,
),
);
}
}