showToast method

void showToast({
  1. required Widget child,
  2. PositionedDencendToastBuilder? positionedDencendToastBuilder,
  3. Duration toastDuration = const Duration(seconds: 2),
  4. DencendToastGravity? gravity,
  5. Duration fadeDuration = const Duration(milliseconds: 350),
  6. bool ignorePointer = false,
  7. bool isDismissible = false,
})

显示自定义Toast

参数说明: child - 要显示的自定义Widget(必需) positionedDencendToastBuilder - 自定义位置构建器 toastDuration - Toast显示持续时间,默认2秒 gravity - Toast显示位置 fadeDuration - 淡入淡出动画时间,默认350毫秒 ignorePointer - 是否忽略触摸事件 isDismissible - 是否可通过点击关闭

Implementation

void showToast({
  required Widget child,
  PositionedDencendToastBuilder? positionedDencendToastBuilder,
  Duration toastDuration = const Duration(seconds: 2),
  DencendToastGravity? gravity,
  Duration fadeDuration = const Duration(milliseconds: 350),
  bool ignorePointer = false,
  bool isDismissible = false,
}) {
  // 检查context是否有效
  if (context == null) {
    throw ("Error: Context is null, Please call init(context) before showing toast.");
  }

  // 创建带有动画功能的Widget
  Widget newChild = _DencendToastStateFul(
    child,
    toastDuration,
    fadeDuration,
    ignorePointer,
    !isDismissible
        ? null
        : () {
      removeCustomDencendToast();
    },
  );

  // 检查键盘是否打开
  // 如果键盘打开且Toast位置是底部,则改为居中显示
  if (gravity == DencendToastGravity.bottom) {
    if (MediaQuery
        .of(context!)
        .viewInsets
        .bottom != 0) {
      gravity = DencendToastGravity.center;
    }
  }

  // 创建OverlayEntry
  OverlayEntry newEntry = OverlayEntry(
    builder: (context) {
      // 如果提供了自定义构建器,使用它
      if (positionedDencendToastBuilder != null) {
        return positionedDencendToastBuilder(context, newChild, gravity);
      }

      // 否则使用默认的位置逻辑
      return _getPositionWidgetBasedOnGravity(newChild, gravity);
    },
  );

  // 添加到队列
  _overlayQueue.add(
    _DencendToastEntry(
      entry: newEntry,
      duration: toastDuration,
      fadeDuration: fadeDuration,
    ),
  );

  // 如果当前没有正在显示的Toast,立即开始显示
  if (_timer == null) {
    _showOverlay();
  }
}