Basics

提示通知

简介

Nylo Website 提供了一个 toast 通知系统,用于向用户显示提示信息。它内置了四种样式 -- success(成功)warning(警告)info(信息)danger(危险) -- 并通过注册模式支持自定义样式。

提示可以从页面、控制器或任何有 BuildContext 的地方触发。

基本用法

在任何 NyState 页面中使用便捷方法显示 toast 通知:

// Success toast
showToastSuccess(description: "Item saved successfully");

// Warning toast
showToastWarning(description: "Your session is about to expire");

// Info toast
showToastInfo(description: "New version available");

// Danger toast
showToastDanger(description: "Failed to save item");

或使用全局函数并指定样式 ID:

showToastNotification(context, id: "success", description: "Item saved!");

内置样式

Nylo Website 注册了四种默认 toast 样式:

样式 ID 图标 颜色 默认标题
success 勾选标记 绿色 Success
warning 感叹号 橙色 Warning
info 信息图标 青色 Info
danger 警告图标 红色 Error

这些在 lib/config/toast_notification.dart 中配置:

class ToastNotificationConfig {
  static final Map<String, ToastStyleFactory> styles = {
    'success': ToastNotification.style(
      icon: Icon(Icons.check_circle, color: Colors.green, size: 20),
      color: Colors.green.shade50,
      defaultTitle: 'Success',
    ),
    'warning': ToastNotification.style(
      icon: Icon(Icons.warning_amber_rounded, color: Colors.orange, size: 20),
      color: Colors.orange.shade50,
      defaultTitle: 'Warning',
    ),
    'info': ToastNotification.style(
      icon: Icon(Icons.info_outline, color: Colors.teal, size: 20),
      color: Colors.teal.shade50,
      defaultTitle: 'Info',
    ),
    'danger': ToastNotification.style(
      icon: Icon(Icons.warning_rounded, color: Colors.red, size: 20),
      color: Colors.red.shade50,
      defaultTitle: 'Error',
    ),
  };
}

从页面显示提示

在任何继承 NyStateNyBaseState 的页面中,使用以下便捷方法:

class _MyPageState extends NyState<MyPage> {

  void onSave() {
    // Success
    showToastSuccess(description: "Saved!");

    // With custom title
    showToastSuccess(title: "Done", description: "Your profile was updated.");

    // Warning
    showToastWarning(description: "Check your input");

    // Info
    showToastInfo(description: "Tip: Swipe left to delete");

    // Danger
    showToastDanger(description: "Something went wrong");

    // Oops (uses danger style)
    showToastOops(description: "That didn't work");

    // Sorry (uses danger style)
    showToastSorry(description: "We couldn't process your request");

    // Custom style by ID
    showToastCustom(id: "custom", description: "Custom alert!");
  }
}

通用 Toast 方法

showToast(
  id: 'success',
  title: 'Hello',
  description: 'Welcome back!',
  duration: Duration(seconds: 3),
);

从控制器显示提示

继承 NyController 的控制器具有相同的便捷方法:

class ProfileController extends NyController {
  void updateProfile() async {
    try {
      await api.updateProfile();
      showToastSuccess(description: "Profile updated");
    } catch (e) {
      showToastDanger(description: "Failed to update profile");
    }
  }
}

可用方法:showToastSuccessshowToastWarningshowToastInfoshowToastDangershowToastOopsshowToastSorryshowToastCustom

showToastNotification

全局函数 showToastNotification() 可以在任何有 BuildContext 的地方显示 toast:

showToastNotification(
  context,
  id: 'success',
  title: 'Saved',
  description: 'Your changes have been saved.',
  duration: Duration(seconds: 3),
  position: ToastNotificationPosition.top,
  action: () {
    // Called when the toast is tapped
    routeTo("/details");
  },
  onDismiss: () {
    // Called when the toast is dismissed
  },
  onShow: () {
    // Called when the toast becomes visible
  },
);

参数

参数 类型 默认值 描述
context BuildContext 必填 构建上下文
id String 'success' Toast 样式 ID
title String? null 覆盖默认标题
description String? null 描述文本
duration Duration? null Toast 显示时长
position ToastNotificationPosition? null 屏幕位置
action VoidCallback? null 点击回调
onDismiss VoidCallback? null 关闭回调
onShow VoidCallback? null 显示回调

ToastMeta

ToastMeta 封装了 toast 通知的所有数据:

ToastMeta(
  title: 'Custom Alert',
  description: 'Something happened.',
  icon: Icon(Icons.star, color: Colors.purple),
  color: Colors.purple.shade50,
  style: 'custom',
  duration: Duration(seconds: 5),
  position: ToastNotificationPosition.top,
  action: () => print("Tapped!"),
  dismiss: () => print("Dismiss pressed"),
  onDismiss: () => print("Toast dismissed"),
  onShow: () => print("Toast shown"),
  metaData: {"key": "value"},
)

属性

属性 类型 默认值 描述
icon Widget? null 图标组件
title String '' 标题文本
style String '' 样式标识符
description String '' 描述文本
color Color? null 图标区域的背景颜色
action VoidCallback? null 点击回调
dismiss VoidCallback? null 关闭按钮回调
onDismiss VoidCallback? null 自动/手动关闭回调
onShow VoidCallback? null 可见时回调
duration Duration 5 秒 显示时长
position ToastNotificationPosition top 屏幕位置
metaData Map<String, dynamic>? null 自定义元数据

copyWith

创建 ToastMeta 的修改副本:

ToastMeta updated = originalMeta.copyWith(
  title: "New Title",
  duration: Duration(seconds: 10),
);

定位

控制 toast 在屏幕上的显示位置:

// Top of screen (default)
showToastNotification(context,
  id: "success",
  description: "Top alert",
  position: ToastNotificationPosition.top,
);

// Bottom of screen
showToastNotification(context,
  id: "info",
  description: "Bottom alert",
  position: ToastNotificationPosition.bottom,
);

// Center of screen
showToastNotification(context,
  id: "warning",
  description: "Center alert",
  position: ToastNotificationPosition.center,
);

自定义 Toast 样式

注册样式

AppProvider 中注册自定义样式:

class AppProvider implements NyProvider {
  @override
  setup(Nylo nylo) async {
    await nylo.configure(
      toastNotifications: {
        ...ToastNotificationConfig.styles,
        'custom': ToastNotification.style(
          icon: Icon(Icons.star, color: Colors.purple, size: 20),
          color: Colors.purple.shade50,
          defaultTitle: 'Custom!',
        ),
      },
    );
    return nylo;
  }
}

或在任何时候添加样式:

nylo.addToastNotifications({
  'promo': ToastNotification.style(
    icon: Icon(Icons.local_offer, color: Colors.pink, size: 20),
    color: Colors.pink.shade50,
    defaultTitle: 'Special Offer',
    position: ToastNotificationPosition.bottom,
    duration: Duration(seconds: 8),
  ),
});

然后使用它:

showToastNotification(context, id: "promo", description: "50% off today!");

创建样式工厂

ToastNotification.style() 创建一个 ToastStyleFactory

static ToastStyleFactory style({
  required Widget icon,
  required Color color,
  required String defaultTitle,
  ToastNotificationPosition? position,
  Duration? duration,
  Widget Function(ToastMeta toastMeta)? builder,
})
参数 类型 描述
icon Widget Toast 的图标组件
color Color 图标区域的背景颜色
defaultTitle String 未提供标题时显示的标题
position ToastNotificationPosition? 默认位置
duration Duration? 默认时长
builder Widget Function(ToastMeta)? 自定义组件构建器,用于完全控制

完全自定义构建器

用于完全控制 toast 组件:

'banner': (ToastMeta meta, void Function(ToastMeta) updateMeta) {
  return Container(
    margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
    padding: EdgeInsets.all(16),
    decoration: BoxDecoration(
      color: Colors.indigo,
      borderRadius: BorderRadius.circular(12),
    ),
    child: Row(
      children: [
        Icon(Icons.campaign, color: Colors.white),
        SizedBox(width: 12),
        Expanded(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            mainAxisSize: MainAxisSize.min,
            children: [
              Text(meta.title, style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold)),
              Text(meta.description, style: TextStyle(color: Colors.white70)),
            ],
          ),
        ),
      ],
    ),
  );
}

AlertTab

AlertTab 是一个徽章组件,用于为导航标签添加通知指示器。它显示一个可切换的徽章,并可选择将状态持久化到存储中。

AlertTab(
  state: "notifications_tab",
  alertEnabled: true,
  icon: Icon(Icons.notifications),
  alertColor: Colors.red,
)

参数

参数 类型 默认值 描述
state String 必填 用于追踪的状态名称
alertEnabled bool? null 是否显示徽章
rememberAlert bool? true 将徽章状态持久化到存储
icon Widget? null 标签图标
backgroundColor Color? null 标签背景颜色
textColor Color? null 徽章文本颜色
alertColor Color? null 徽章背景颜色
smallSize double? null 小徽章尺寸
largeSize double? null 大徽章尺寸
textStyle TextStyle? null 徽章文本样式
padding EdgeInsetsGeometry? null 徽章内边距
alignment Alignment? null 徽章对齐方式
offset Offset? null 徽章偏移量
isLabelVisible bool? true 显示徽章标签

工厂构造函数

NavigationTab 创建:

AlertTab.fromNavigationTab(
  myNavigationTab,
  index: 0,
  icon: Icon(Icons.home),
  stateName: "home_alert",
)

示例

保存后的成功提示

void saveItem() async {
  try {
    await api<ItemApiService>((request) => request.saveItem(item));
    showToastSuccess(description: "Item saved successfully");
  } catch (e) {
    showToastDanger(description: "Could not save item. Please try again.");
  }
}

带操作的交互式 Toast

showToastNotification(
  context,
  id: "info",
  title: "New Message",
  description: "You have a new message from Anthony",
  action: () {
    routeTo(ChatPage.path, data: {"userId": "123"});
  },
  duration: Duration(seconds: 8),
);

底部定位的警告

showToastNotification(
  context,
  id: "warning",
  title: "No Internet",
  description: "You appear to be offline. Some features may not work.",
  position: ToastNotificationPosition.bottom,
  duration: Duration(seconds: 10),
);