Flutter学习指南:交互、手势和动画(2),看完全都会了

);  
}
}

除了上面代码使用到的 onTap,GestureDetector 还支持许多其他事件:

  • onTapDown:按下

  • onTap:点击动作

  • onTapUp:抬起

  • onTapCancel:前面触发了 onTapDown,但并没有完成一个 onTap 动作

  • onDoubleTap:双击

  • onLongPress:长按

  • onScaleStart, onScaleUpdate, onScaleEnd:缩放

  • onVerticalDragDown, onVerticalDragStart, onVerticalDragUpdate, onVerticalDragEnd, onVerticalDragCancel, onVerticalDragUpdate:在竖直方向上移动

  • onHorizontalDragDown, onHorizontalDragStart, onHorizontalDragUpdate, onHorizontalDragEnd, onHorizontalDragCancel, onHorizontalDragUpdate:在水平方向上移动

  • onPanDown, onPanStart, onPanUpdate, onPanEnd, onPanCancel:拖曳(水平、竖直方向上移动)

如果同时设置了 onVerticalXXX 和 onHorizontalXXX,在一个手势里,只有一个会触发(如果用户首先在水平方向移动,则整个过程只触发 onHorizontalUpdate;竖直方向的类似)

这里要说明的是,onVerticalXXX/onHorizontalXXX 和 onPanXXX 不能同时设置。如果同时需要水平、竖直方向的移动,使用 onPanXXX。

如果读者希望在用户点击的时候能够有个水波纹效果,可以使用 InkWell,它的用法跟 GestureDetector 类似,只是少了拖动相关的手势(毕竟,这个水波纹效果只有在点击的时候才有意义)。

原始手势事件监听

GestureDetector 在绝大部分时候都能够满足我们的需求,如果真的满足不了,我们还可以使用最原始的 Listener 控件。

class TestWidget extends StatelessWidget {  
@override  
Widget build(BuildContext context) {    
return Listener(      
child: Text(‘text’),      
onPointerDown: (event) => print(‘onPointerDown’),      
onPointerUp: (event) => print(‘onPointerUp’),      
onPointerMove: (event) => print(‘onPointerMove’),      
onPointerCancel: (event) => print(‘onPointerCancel’),    
);  
}
}

在页面间跳转

Flutter 里所有的东西都是 widget,所以,一个页面,也是 widget。为了调整到新的页面,我们可以 push 一个 route 到 Navigator 管理的栈中。

Navigator.push(  
context,  
MaterialPageRoute(builder: (_) => SecondScreen())
);

需要返回的话,pop 掉就可以了:

Navigator.pop(context);

下面是完整的例子:

除了打开一个页面,Flutter 也支持从页面返回数据:

Navigator.pop(context, ‘message from second screen’);

由于打开页面是异步的,页面的结果通过一个 Future 来返回:

onPressed: () async {  
// Navigator.push 会返回一个 Future,如果你对这里使用的 await不太熟悉,可以参考  
// https://www.dartlang.org/guides/language/language-tour#asynchrony-support  
var msg = await Navigator.push(    
context,    
MaterialPageRoute(builder: (_) => SecondScreen())  
);  
debugPrint(‘msg = $msg’);}

我们还可以在 MaterialApp 里设置好每个 route 对应的页面,然后使用 Navigator.pushNamed(context, routeName) 来打开它们:

MaterialApp(  
// 从名字叫做 ‘/’ 的 route 开始(也就是 home)  
initialRoute: ‘/’,  
routes: {    
‘/’: (context) => HomeScreen(),    
‘/about’: (context) => AboutScreen(),  
},
);

接下来,我们通过实现一个 echo 客户端的前端页面来综合运用前面所学的知识(逻辑部分我们留到下一篇文章再补充)。

echo 客户端

消息输入页

这一节我们来实现一个用户输入的页面。UI 很简单,就是一个文本框和一个按钮。


这里的按钮本应该使用 RaisedButton 或 FlatButton。为了演示如何监听手势事件,我们这里故意自己用 Container 做了一个按钮,然后通过 InkWell 监听手势事件。InkWell 除了上面展示的几个事件外,还带有一个水波纹效果。如果不需要这个水波纹效果,读者也可以使用 GestureDetector。

消息列表页面

我们的 echo 客户端共有两个页面,一个用于展示所有的消息,另一个页面用户输入消息,后者在上一小节我们已经写好了。下面,我们来实现用于展示消息的页面。

页面间跳转

我们的页面包含一个列表和一个按钮,列表用于展示信息,按钮则用来打开上一节我们所实现的 AddMessageScreen。这里我们先添加一个按钮并实现页面间的跳转。

// 这是我们的消息展示页面class MessageListScreen extends StatelessWidget {  
@override  
Widget build(BuildContext context) {    
return Scaffold(      
appBar: AppBar(        
title: Text(‘Echo client’),      
),      
floatingActionButton: FloatingActionButton(        
onPressed: () {          
// push 一个新的 route 到 Navigator 管理的栈中,以此来打开一个页面          
Navigator.push(              
context,              
MaterialPageRoute(builder: (_) => AddMessageScreen())          
);        
},        
tooltip: ‘Add message’,        
child: Icon(Icons.add),      
)    
);  
}
}

在消息的输入页面,我们点击 Send 按钮后就返回:

onTap: () {  
debugPrint(‘send: ${editController.text}’);  
Navigator.pop(context);
}

最后,我们加入一些骨架代码,实现一个完整的应用:

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

class MyApp extends StatelessWidget {

@override  
Widget build(BuildContext context) {    
return MaterialApp(      
title: ‘Flutter UX demo’,      
home: MessageListScreen(),    
);  
}
}

但是,上面代码所提供的功能还不够,我们需要从 AddMessageScreen 中返回一个消息。

首先我们对数据建模:

class Message {  
final String msg;  
final int timestamp;

Message(this.msg, this.timestamp);

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

最后

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。

最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

Android学习PDF+架构视频+面试文档+源码笔记领取

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

【算法合集】

【延伸Android必备知识点】

【Android部分高级架构视频学习资源】

id核心高级技术PDF文档,BAT大厂面试真题解析】**

[外链图片转存中…(img-gKQlUBKO-1711395179706)]

【算法合集】

[外链图片转存中…(img-bwYSwGIp-1711395179707)]

【延伸Android必备知识点】

[外链图片转存中…(img-7i3vtKyH-1711395179707)]

【Android部分高级架构视频学习资源】

Android精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

  • 12
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值