美文网首页
从零开始用flutter写一个完整应用⑻:Gestures 手势

从零开始用flutter写一个完整应用⑻:Gestures 手势

作者: 逃离_102 | 来源:发表于2022-07-01 23:09 被阅读0次

说明

手势是用户交互必不可少的功能,各种点击触摸事件等。下面将常用的几个处理类进行展开讨论。

1,添加点按涟漪效果 (Material Design)

当我们在开发遵循 Material Design 规范应用的时候,我们可能会需要为某个 widgets 的点击加入涟漪效果。
Flutter 提供了 InkWell widget 来实现这个功能。示例如下

//用 InkWell widget 包裹它,并设置回调函数,就可以显示涟漪动画了
InkWell(
  onTap: () {
    //实现回调函数
  },
  child: const Padding(
    padding: EdgeInsets.all(12.0),
    child: Text('Flat Button'),
  ),
)

2,捕获和处理点击动作

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

// 用 GestureDetector 包裹按钮,并传入 onTap 回调函数
GestureDetector(
  // 当它的子元素被点击,显示一个 snackbar 
  onTap: () {
    const snackBar = SnackBar(content: Text('Tap'));
    ScaffoldMessenger.of(context).showSnackBar(snackBar);
  },
  // 这个是我们的自定义按钮
  child: Container(
    padding: const EdgeInsets.all(12.0),
    decoration: BoxDecoration(
      color: Colors.lightBlue,
      borderRadius: BorderRadius.circular(8.0),
    ),
    child: const Text('My Button'),
  ),
)

注意事项:
1,这里为了说明原理,我们创建了自定义的按钮,其实 Flutter 已经为我们准备了很多现成的按钮供我们使用,比如: ElevatedButtonTextButtonCupertinoButton
2,GestureDetector 不只有onTap 点击回调事件,还有onDoubleTap:"双击",onLongPress: "长按",onTapCancel: "取消",onTapUp: "松开",onTapDown: "按下";拖动手势onPanDown(手指按下)、onPanUpdate(手指滑动)、onPanEnd(滑动结束);缩放手势的onScaleUpdate方法等。

3,实现「滑动清除」效果

“滑动清除”在许多移动应用中都很常见。比如,我们在写一个邮件应用,我们会想让用户能够滑动删除列表中的邮件消息。用户操作时,我们可能需要把这封邮件从收件箱移动到垃圾箱。Flutter 提供了 Dismissible Widget 来轻松地实现这个需求。示例如下

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

// MyApp是一个StatefulWidget。这样,我们就能够在列表项被移除的时候,更新Widget的状态。
class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  MyAppState createState() {
    return MyAppState();
  }
}

class MyAppState extends State<MyApp> {
  final items = List<String>.generate(20, (i) => 'Item ${i + 1}');

  @override
  Widget build(BuildContext context) {
    const title = 'Dismissing Items';

    return MaterialApp(
      title: title,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: const Text(title),
        ),
        body: ListView.builder(
          itemCount: items.length,
          itemBuilder: (context, index) {
            final item = items[index];
            return Dismissible(
              // 每个Dismissible实例都必须包含一个Key。Key让Flutter能够对Widgets做唯一标识。
              key: Key(item),
              // 我们还需要提供一个函数,告诉应用,在项目被移出后,要做什么。
              onDismissed: (direction) {
                // Remove the item from the data source.
                // 从数据源中移除项目
                setState(() {
                  items.removeAt(index);
                });

                // 移除成功展示一个SnackBar提示
                ScaffoldMessenger.of(context)
                    .showSnackBar(SnackBar(content: Text('$item dismissed')));
              },
              // 列表项被滑出时,显示一个红色背景
              background: Container(color: Colors.red),
              child: ListTile(
                title: Text(item),
              ),
            );
          },
        ),
      ),
    );
  }
}

手势的部分就先介绍到这里,如有遗漏欢迎留言,如有错误欢迎指正,谢谢

相关文章

网友评论

      本文标题:从零开始用flutter写一个完整应用⑻:Gestures 手势

      本文链接:https://www.haomeiwen.com/subject/oqxqbrtx.html