跳至主要内容

显示 Snackbar

在某些操作发生时,简要通知用户可能很有用。例如,当用户在列表中滑动删除消息时,您可能希望通知他们消息已被删除。您甚至可能希望给他们一个撤消操作的选项。

在 Material Design 中,这是 SnackBar 的作用。此示例使用以下步骤实现了一个 SnackBar

  1. 创建一个 Scaffold
  2. 显示一个 SnackBar
  3. 提供一个可选操作。

1. 创建 Scaffold

#

在创建遵循 Material Design 指南的应用时,为您的应用提供一致的视觉结构。在此示例中,在屏幕底部显示 SnackBar,而不会与其他重要的 widget(例如 FloatingActionButton)重叠。

来自 material 库Scaffold widget 创建了这种视觉结构,并确保重要的 widget 不会重叠。

dart
return MaterialApp(
  title: 'SnackBar Demo',
  home: Scaffold(
    appBar: AppBar(
      title: const Text('SnackBar Demo'),
    ),
    body: const SnackBarPage(),
  ),
);

2. 显示 SnackBar

#

Scaffold 就位后,显示一个 SnackBar。首先,创建一个 SnackBar,然后使用 ScaffoldMessenger 显示它。

dart
const snackBar = SnackBar(
  content: Text('Yay! A SnackBar!'),
);

// Find the ScaffoldMessenger in the widget tree
// and use it to show a SnackBar.
ScaffoldMessenger.of(context).showSnackBar(snackBar);

3. 提供可选操作

#

当显示 SnackBar 时,您可能希望向用户提供一个操作。例如,如果用户意外删除了一条消息,他们可以使用 SnackBar 中的一个可选操作来恢复该消息。

这是一个向 SnackBar widget 提供额外 action 的示例

dart
final snackBar = SnackBar(
  content: const Text('Yay! A SnackBar!'),
  action: SnackBarAction(
    label: 'Undo',
    onPressed: () {
      // Some code to undo the change.
    },
  ),
);

交互式示例

#
import 'package:flutter/material.dart';

void main() => runApp(const SnackBarDemo());

class SnackBarDemo extends StatelessWidget {
  const SnackBarDemo({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'SnackBar Demo',
      home: Scaffold(
        appBar: AppBar(
          title: const Text('SnackBar Demo'),
        ),
        body: const SnackBarPage(),
      ),
    );
  }
}

class SnackBarPage extends StatelessWidget {
  const SnackBarPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Center(
      child: ElevatedButton(
        onPressed: () {
          final snackBar = SnackBar(
            content: const Text('Yay! A SnackBar!'),
            action: SnackBarAction(
              label: 'Undo',
              onPressed: () {
                // Some code to undo the change.
              },
            ),
          );

          // Find the ScaffoldMessenger in the widget tree
          // and use it to show a SnackBar.
          ScaffoldMessenger.of(context).showSnackBar(snackBar);
        },
        child: const Text('Show SnackBar'),
      ),
    );
  }
}