在某些情况下,我们需要用方便且友好的方式告诉用户发生了什么。例如,当用户滑动删除列表中的一条消息时,我们或许想提醒用户消息已经被删除了,或者除了提醒之外,我们还可以提供一个撤销的操作。

在 Material Design 中,用一个 SnackBar 就可以实现这个需求。

步骤

  • 创建一个 Scaffold

  • 显示一个 Scaffold

  • 提供一个附加的操作

1. 创建一个 Scaffold

在创建遵循 Material Design 设计规范的应用时,我们希望应用可以有一个一致的视觉层次结构。当我们在屏幕的底部显示一个 SnackBar 时,不能覆盖其他重要的 Widgets,比如 FloatingActionButton

material library 中的 Scaffold Widget 就可以创建一个一致的视觉层次结构,并且可以确保其他重要的 Widgets 不会被覆盖!

  1. Scaffold(
  2. appBar: AppBar(
  3. title: Text('SnackBar Demo'),
  4. ),
  5. body: SnackBarPage(), // You'll fill this in below!
  6. );

2. 显示一个 SnackBar

有了 Scaffold ,我们就可以显示一个 SnackBar 了!首先,我们需要先创建一个 SnackBar ,然后使用 Scaffold 来显示它。

  1. final snackBar = SnackBar(content: Text('Yay! A SnackBar!'));
  2. // Find the Scaffold in the Widget tree and use it to show a SnackBar
  3. Scaffold.of(context).showSnackBar(snackBar);

3. 提供一个附加的操作

在某些情况下,我们可能想在显示 SnackBar 的时候给用户提供一个附加的操作。比如,当他们意外的删除了一个消息,我们可以提供一个撤销更改的操作。

为了实现这一功能,我们可以在创建 SnackBar Widget 的时候提供一个附加的 action 参数。

  1. final snackBar = SnackBar(
  2. content: Text('Yay! A SnackBar!'),
  3. action: SnackBarAction(
  4. label: 'Undo',
  5. onPressed: () {
  6. // Some code to undo the change!
  7. },
  8. ),
  9. );

完整示例

注意: 这个例子是当用户点击一个按钮的时候显示一个 SnackBar。更多有关处理用户输入的信息,请查阅实用教程 (Cookbook) 的 Gestures 部分。

  1. import 'package:flutter/material.dart';
  2. void main() => runApp(SnackBarDemo());
  3. class SnackBarDemo extends StatelessWidget {
  4. @override
  5. Widget build(BuildContext context) {
  6. return MaterialApp(
  7. title: 'SnackBar Demo',
  8. home: Scaffold(
  9. appBar: AppBar(
  10. title: Text('SnackBar Demo'),
  11. ),
  12. body: SnackBarPage(),
  13. ),
  14. );
  15. }
  16. }
  17. class SnackBarPage extends StatelessWidget {
  18. @override
  19. Widget build(BuildContext context) {
  20. return Center(
  21. child: RaisedButton(
  22. onPressed: () {
  23. final snackBar = SnackBar(
  24. content: Text('Yay! A SnackBar!'),
  25. action: SnackBarAction(
  26. label: 'Undo',
  27. onPressed: () {
  28. // Some code to undo the change!
  29. },
  30. ),
  31. );
  32. // Find the Scaffold in the Widget tree and use it to show a SnackBar!
  33. Scaffold.of(context).showSnackBar(snackBar);
  34. },
  35. child: Text('Show SnackBar'),
  36. ),
  37. );
  38. }
  39. }

SnackBar Demo