我们的 app 不仅要把信息展示给用户,还要和用户进行交互。怎么响应用户的点击,拖动等操作行为呢? 我们使用GestureDetectorWidget!

我们来实现一个按钮,当用户点击的时候显示 snackbar 消息。要怎么做呢?

步骤

  • 创建一个按钮。

  • GestureDetector 包裹按钮,并传入 onTap 回调函数。

  1. // Our GestureDetector wraps our button
  2. GestureDetector(
  3. // 当它的子元素被点击,显示一个 snackbar (When the child is tapped, show a snackbar)
  4. onTap: () {
  5. final snackBar = SnackBar(content: Text("Tap"));
  6. Scaffold.of(context).showSnackBar(snackBar);
  7. },
  8. // 这个是我们的自定义按钮 (Our Custom Button!)
  9. child: Container(
  10. padding: EdgeInsets.all(12.0),
  11. decoration: BoxDecoration(
  12. color: Theme.of(context).buttonColor,
  13. borderRadius: BorderRadius.circular(8.0),
  14. ),
  15. child: Text('My Button'),
  16. ),
  17. );

注意

完整代码

  1. import 'package:flutter/material.dart';
  2. void main() => runApp(MyApp());
  3. class MyApp extends StatelessWidget {
  4. @override
  5. Widget build(BuildContext context) {
  6. final title = 'Gesture Demo';
  7. return MaterialApp(
  8. title: title,
  9. home: MyHomePage(title: title),
  10. );
  11. }
  12. }
  13. class MyHomePage extends StatelessWidget {
  14. final String title;
  15. MyHomePage({Key key, this.title}) : super(key: key);
  16. @override
  17. Widget build(BuildContext context) {
  18. return Scaffold(
  19. appBar: AppBar(
  20. title: Text(title),
  21. ),
  22. body: Center(child: MyButton()),
  23. );
  24. }
  25. }
  26. class MyButton extends StatelessWidget {
  27. @override
  28. Widget build(BuildContext context) {
  29. // Our GestureDetector wraps our button
  30. return GestureDetector(
  31. // When the child is tapped, show a snackbar
  32. onTap: () {
  33. final snackBar = SnackBar(content: Text("Tap"));
  34. Scaffold.of(context).showSnackBar(snackBar);
  35. },
  36. // Our Custom Button!
  37. child: Container(
  38. padding: EdgeInsets.all(12.0),
  39. decoration: BoxDecoration(
  40. color: Theme.of(context).buttonColor,
  41. borderRadius: BorderRadius.circular(8.0),
  42. ),
  43. child: Text('My Button'),
  44. ),
  45. );
  46. }
  47. }

Handling Taps Demo