处理Taps
我们不仅希望向用户展示信息,还希望我们的用户与我们的应用互动!那么,我们如何响应用户基本操作,如点击和拖动? 在Flutter中我们可以使用GestureDetector
Widget!
假设我们想要创建一个自定义按钮,当点击时显示一个SnackBar。我们如何解决这个问题?
步骤
- 创建一个button。
- 把它包装在
GestureDetector
中并提供一个onTap
回调。
// Our GestureDetector wraps our button
new GestureDetector(
// When the child is tapped, show a snackbar
onTap: () {
final snackBar = new SnackBar(content: new Text("Tap"));
Scaffold.of(context).showSnackBar(snackBar);
},
// Our Custom Button!
child: new Container(
padding: new EdgeInsets.all(12.0),
decoration: new BoxDecoration(
color: Theme.of(context).buttonColor,
borderRadius: new BorderRadius.circular(8.0),
),
child: new Text('My Button'),
),
);
注意
- 如果您想将Material 水波效果添加到按钮中,请参阅”添加Material 触摸水波” 。
- 虽然我们已经创建了一个自定义按钮来演示这些概念,但Flutter也提供了一些其它开箱即用的按钮:RaisedButton、FlatButton和CupertinoButton。
完整的例子
import 'package:flutter/material.dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
final title = 'Gesture Demo';
return new MaterialApp(
title: title,
home: new MyHomePage(title: title),
);
}
}
class MyHomePage extends StatelessWidget {
final String title;
MyHomePage({Key key, this.title}) : super(key: key);
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text(title),
),
body: new Center(child: new MyButton()),
);
}
}
class MyButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
// Our GestureDetector wraps our button
return new GestureDetector(
// When the child is tapped, show a snackbar
onTap: () {
final snackBar = new SnackBar(content: new Text("Tap"));
Scaffold.of(context).showSnackBar(snackBar);
},
// Our Custom Button!
child: new Container(
padding: new EdgeInsets.all(12.0),
decoration: new BoxDecoration(
color: Theme.of(context).buttonColor,
borderRadius: new BorderRadius.circular(8.0),
),
child: new Text('My Button'),
),
);
}
}