Flutter Toast 封装

395 阅读1分钟

Flutter Toast 封装

# add this line to your dependencies
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,
      ),
    );
  }
}