轻量级提示

这里提到的轻量级提示指的是在提示出现的过程中不会打断用户当前正在进行中的操作,只是在UI上有一小段时间的提示,隔一段时间之后提示内容自动消失,例如原生Android的Toast、SnackBar一样,并不会像Dialog一样出现之后用户必须停止正在进行的操作去完成Dialog引发的逻辑操作之后才能继续在dialog出现之前的操作。

1.Tooltip

Tooltip支持用户传入任意一个child作为显示的Widget,并且在用户长按Widget时,会在上方或者下方出现类似Toast的提示,隔一段时间自动消失,由于使用起来比较简单,我就在代码注释里讲解就不展开赘述了。

  1. import 'package:flutter/material.dart';
  2. void main() {
  3. runApp(new MaterialApp(
  4. home: new MyApp(),
  5. ));
  6. }
  7. class MyApp extends StatelessWidget {
  8. @override
  9. Widget build(BuildContext context) {
  10. return Scaffold(
  11. appBar: AppBar(
  12. title: Text("Tooltips"),
  13. ),
  14. body: Center(
  15. child: Tooltip(
  16. message: "显示提示内容",
  17. height: 60.0,
  18. verticalOffset: 50.0,
  19. preferBelow:false,
  20. padding: EdgeInsets.all(20.0),
  21. child: Icon(
  22. Icons.android,
  23. size: 50.0,
  24. color: Colors.green,
  25. )),
  26. ),
  27. );
  28. }
  29. }

效果图
10.  轻量级提示 - 图1

2.SnackBar

SnackBar无论是用法还是功能使用几乎都跟原生Android一样 ,唯一有一点需要留意的是在 Scaffold.of(context).showSnackBar()中传递的context必须不能是Scaffold下面的Context

原因解释

因为Scaffold.of() 方法需要从Widget树中去找到Scaffold的Context,所以如果直接在Scaffold中使用showSnackBar,需要在外层包括上Builder Widget,这个Builder不做任何的其他操作,只不过把Widget树往下移了一层而已,这里也是很多初学者照着网上的Demo写完之后怎么写弹不出来SnackBar的原因,所以这里特此说明一下。

来看下SnackBar的效果图,你会发现跟原生Android如出一辙。
10.  轻量级提示 - 图2

样例代码

  1. import 'package:flutter/material.dart';
  2. void main() {
  3. runApp(new MaterialApp(home: new MyApp()));
  4. }
  5. class MyApp extends StatelessWidget {
  6. @override
  7. Widget build(BuildContext context) {
  8. return new Scaffold(
  9. appBar: new AppBar(
  10. title: new Text("SnackBar"),
  11. ),
  12. body: new Center(
  13. child: new Builder(builder: (BuildContext context) {
  14. return new RaisedButton(
  15. onPressed: () {
  16. Scaffold.of(context).showSnackBar(new SnackBar(
  17. content: new Text("SanckBar is Showing "),
  18. action: new SnackBarAction(
  19. label: "撤销",
  20. onPressed: () {
  21. print("点击撤回---------------");
  22. }),
  23. ));
  24. },
  25. child: new Text("SnackBar提示"),
  26. color: Colors.cyan,
  27. highlightColor: Colors.lightBlueAccent,
  28. disabledColor: Colors.lightBlueAccent,
  29. );
  30. }),
  31. ),
  32. );
  33. }
  34. }

Dialog&Toast

上面介绍了Tooltip跟SnackBar,在介绍此二者的时候笔者也提到它们定位为轻量级的提示Widget,那对应的就会有非轻量级的提示组件,意思就是在此类提示出现的过程中,会打断用户正在进行的操作,强制用户处处理对话框上的逻辑之后才能回过头来继续原有的用户操作,例如AlertDialog、BottomSheetDialog等,接下来笔者就带大家一起体验一下这类提示操作的用法。

Flutter中要求开发者通过 showDialog(context,child),来唤起各种不同类型的dialog显示, context为上下文参数, child为要显示的对话框类型,例如,SimpleDialog、AlertDialog、AboutDialog、BottomSheetDialog等都需要借助showDialog来唤起。

1.SimpleDialog

SimpleDialog跟它的名字一样,它就是一个简单的对话框,开发者只需传入title跟child就可以使用它,其中child是一个Widget数组,用户可以根据业务需求传入任意的Widget,然后借助showDialog唤起即可。

效果图
10.  轻量级提示 - 图3

样例代码

  1. import 'package:flutter/material.dart';
  2. void main() {
  3. runApp(new MaterialApp(home: new MyApp()));
  4. }
  5. class MyApp extends StatelessWidget {
  6. @override
  7. Widget build(BuildContext context) {
  8. return new Scaffold(
  9. appBar: new AppBar(
  10. title: new Text("SimpleDialog"),
  11. ),
  12. body: new Center(
  13. child: new RaisedButton(
  14. onPressed: () {
  15. showDialog(
  16. context: context,
  17. child: new SimpleDialog(
  18. title: new Text("标题"),
  19. contentPadding: const EdgeInsets.all(10.0),
  20. children: <Widget>[
  21. new Text("文字内容1"),
  22. new ListTile(
  23. leading: new Icon(Icons.android),
  24. title: new Text("android"),
  25. ),
  26. new Text("文字内容2"),
  27. new Text("文字内容3"),
  28. new Text("文字内容4"),
  29. ],
  30. ));
  31. },
  32. child: new Text("Dialog出来"),
  33. color: Colors.blue,
  34. highlightColor: Colors.lightBlueAccent,
  35. disabledColor: Colors.lightBlueAccent),
  36. ),
  37. );
  38. }
  39. }

2.AlertDialog

AlertDialog其实就是simpleDialog的封装,更加方便开发者使用,只不过在SimpleDialog的基础上新增了action操作而已,用户可以定制具体类似,”取消”、”确定”等一切可能存在dialog上的逻辑处理。其余没有什么需要特别强调的知识点,也是跟simpledialog一样,需要借助showDialog唤起,使用起来比较简单,直接从代码里说明了。

样例代码

  1. import 'package:flutter/material.dart';
  2. void main() {
  3. runApp(new MaterialApp(home: new MyApp()));
  4. }
  5. class MyApp extends StatelessWidget {
  6. @override
  7. Widget build(BuildContext context) {
  8. return new Scaffold(
  9. appBar: new AppBar(
  10. title: new Text("AlertDialog"),
  11. ),
  12. body: new Center(
  13. child: new Builder(builder: (BuildContext context) {
  14. return new RaisedButton(
  15. onPressed: () {
  16. showDialog(
  17. context: context,
  18. child: new AlertDialog(
  19. title: new Text("标题"),
  20. content: new Text("内容区域"),
  21. actions: <Widget>[
  22. new FlatButton(
  23. onPressed: () {
  24. Navigator.of(context);
  25. },
  26. child: new Text("确定")),
  27. new FlatButton(
  28. onPressed: () {
  29. print("点击取消------");
  30. },
  31. child: new Text("取消")),
  32. ],
  33. ));
  34. },
  35. color: Colors.lightBlueAccent,
  36. child: new Icon(Icons.phone),
  37. );
  38. }),
  39. ),
  40. );
  41. }
  42. }

效果图
10.  轻量级提示 - 图4

文章开头的效果图上提到的aboutDialog跟alertDialog类似,同样也是封装了simpleDialog,读者可自行阅读尝试具体用法,我就不在此详细解说了,下面我想说一下BottomSheetDialog跟ModalBottomSheetDialog。

3.BottomSheetDialog、ModalBottomSheetDialog

BottomSheetDialog、ModalBottomSheetDialog同样也是需要借助showDialog唤起,就跟它名字一样,这两种dialog是从屏幕下方向上弹出的,不同的是BottomSheetDialog默认会铺满全屏显示,而ModalBottomSheetDialog半屏显示,二者都支持随用户手指拖动上下移动。

方法签名

  1. showBottomSheet(context,child) 上下文参数,Widget数组
  1. showModalBottomSheet(context,child) 上下文参数,Widget数组

来一起体验一下这俩东西怎么使用
10.  轻量级提示 - 图5

样例代码

  1. import 'package:flutter/material.dart';
  2. void main() {
  3. runApp(new MaterialApp(home: new MyApp()));
  4. }
  5. class MyApp extends StatelessWidget {
  6. @override
  7. Widget build(BuildContext context) {
  8. return new Scaffold(
  9. appBar: new AppBar(
  10. title: new Text("BottomSheet"),
  11. ),
  12. body: new Column(
  13. children: <Widget>[
  14. new Builder(builder: (BuildContext context){
  15. return new RaisedButton(
  16. onPressed: () {
  17. showBottomSheet(
  18. context: context,
  19. builder: (BuildContext context) {
  20. return new Container(
  21. child: new Padding(
  22. padding: const EdgeInsets.all(10.0),
  23. child: new Column(
  24. children: <Widget>[
  25. new ListTile(
  26. leading: new Icon(Icons.chat),
  27. title: new Text("对话框列表1"),
  28. ),
  29. new ListTile(
  30. leading: new Icon(Icons.help),
  31. title: new Text("对话框列表2"),
  32. ),
  33. new ListTile(
  34. leading: new Icon(Icons.settings),
  35. title: new Text("对话框列表3"),
  36. ),
  37. new ListTile(
  38. leading: new Icon(Icons.more),
  39. title: new Text("对话框列表4"),
  40. ),
  41. ],
  42. ),
  43. ),
  44. );
  45. });
  46. },
  47. child: new Text("BottomSheet"),
  48. );
  49. }),
  50. new RaisedButton(
  51. onPressed: () {
  52. showModalBottomSheet(
  53. context: context,
  54. builder: (BuildContext context) {
  55. return new Container(
  56. child: new Padding(
  57. padding: const EdgeInsets.all(10.0),
  58. child: new Column(
  59. children: <Widget>[
  60. new ListTile(
  61. leading: new Icon(Icons.chat),
  62. title: new Text("对话框列表1"),
  63. ),
  64. new ListTile(
  65. leading: new Icon(Icons.help),
  66. title: new Text("对话框列表2"),
  67. ),
  68. new ListTile(
  69. leading: new Icon(Icons.settings),
  70. title: new Text("对话框列表3"),
  71. ),
  72. new ListTile(
  73. leading: new Icon(Icons.more),
  74. title: new Text("对话框列表4"),
  75. ),
  76. ],
  77. ),
  78. ),
  79. );
  80. });
  81. },
  82. child: new Text("ModalBottomSheet"),
  83. ),
  84. ],
  85. ),
  86. );
  87. }
  88. }