
正文
flutter最上层,flutter上下滑动切换
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
Flutter了解之手势
描述了屏幕上指针(触摸、鼠标、触控笔)的位置和移动。
Flutter中可以使用Listener(功能性组件)来监听原始触摸事件
例1
例2
例3
忽略PointerEvent
手势: 描述由一个或多个指针移动组成的语义动作,如拖动、缩放、双击等。
Material大多数widget已经对tap或手势做出了响应。 例如 IconButton和 FlatButton 响应单击,ListView响应滑动事件触发滚动。
用于手势识别的功能性组件,通过它可以来识别各种手势。
例(单击)
例(添加Material触摸水波效果 InkWell组件)
例(滑动关闭 Dismissable组件)
例(单击、双击、长按)
例(滑动)
例(扫动---单一方向)
例(缩放)
GestureRecognizer是一个抽象类。
一种手势的识别器对应一个GestureRecognizer的子类。
例
由于手势竞争最终只有一个胜出者,所以,当有多个手势识别器时,可能会产生冲突。
例
例
在APP中经常会需要一个广播机制,用以跨页面通知。比如一个需要登录的APP中,页面会关注用户登录或注销事件,来进行一些状态更新。
这时候,一个事件总线便会非常有用,事件总线通常实现了订阅者模式,订阅者模式包含发布者和订阅者两种角色,可以通过事件总线来触发事件和监听事件。
对于一些简单的应用,事件总线是足以满足业务需求的,如果决定使用状态管理包的话,一定要想清楚APP是否真的有必要使用它,防止“化简为繁”、过度设计。
例
在widget树中,每一个节点都可以分发通知,通知会沿着当前节点向上传递,所有父节点都可以通过NotificationListener来监听通知。
Flutter中将这种由子向父的传递通知的机制称为通知冒泡(Notification Bubbling)。
通知冒泡和用户触摸事件冒泡是相似的,但有一点不同:通知冒泡可以中止,但用户触摸事件不行。
通知冒泡和Web开发中浏览器事件冒泡原理是相似的,都是事件从出发源逐层向上传递,可以在上层节点任意位置来监听通知/事件,也可以终止冒泡过程,终止冒泡后,通知将不会再向上传递。
Flutter的UI框架实现中,除了在可滚动组件在滚动过程中会发出ScrollNotification之外,还有一些其它的通知,如SizeChangedLayoutNotification、KeepAliveNotification 、LayoutChangedNotification等,Flutter正是通过这种通知机制来使父元素可以在一些特定时机来做一些事情。
例
例
例
阻止冒泡
通知冒泡原理
相关问答
Q1: Flutter开发--如何布局?
相对于iOS开发,Flutter的布局更具有灵活性,每个页面设计都不一样,相同页面可选择的布局方式也不一样,如果单纯的说应该如何去布局,我觉得不现实,大家可以参考下 Flutter官方的布局教程 。接下来,笔者,通过项目中的一个页面,来一步一步的拆解布局的流程。整个过程,基本上按照拆解、组件封装、具体布局这三步来的。
根据设计图,可以看出整体可以分成两部分,上面一部分是系统介绍模块,下面一部分是真正的登录内容,因为涉及到叠加,因此考虑用Stack;
系统介绍模块部分:整体也是涉及到叠加,考虑用Stack,分为四部分。最底部渐变色背景用一个contanier,无须指定位置,全视图扩展;载放logo图标在上一层,用Image。最后两个Text同级放在最上层。Image,Text各用Positioned包裹去指定位置。
登录内容模块是最外层是一个Contanier容器,去控制背景色和圆角。然后是一个Column元素,逐行排列。
第一行为Image,
第二行为Text,
第三行可以看成一个小Column,分两块进行布局
第四行可以看成一个小Column,分两块进行布局
第五行可以看作一个TextButton,
第六行可以看作一个Row,分三块进行布局
通过上面这样一步一步的分析后,基本上对大致的布局有了一个了解,最外层的控件大致选对(只要能实现的话,就是复杂度以及效率的问题),然后一步一步的拆解每一行的元素,如果有重复的或者觉得可以封装出来的部分,则进行下一步。
每一行的拆解,大致也是按照这个思路来进行,因此笔者在这里就不做讲解了。
在做到第三第四行的时候,发现这两个很相似,而且设计到一些交互逻辑,笔者就想对第三第四行的这种展示进行封装,觉得今后的布局可能会用到,因此在这一步,可以先把这一块儿抽离出一个控件。利用TextField来实现这种输入操作,具体的实现笔者不再详细的描述了。
经过这一步,整体的规划设计图已经有了,各个组件也都有了,接下来的工作就是组装了。
具体布局设计到一些细节的地方,例如整体Column的居中对齐(crossAxisAlignment)、间隔(Padding或Container包裹,笔者更喜欢用SizedBox占位)、居左居右居中(Align)、点击事件(GestureDetector)以及圆角(BorderRadius)等一些特殊情况。
像第六行row是放在底部的,就可以在第六行前面增加一个Spacer()去填充空白区域。
对文字颜色大小等,可以用TextStyle直接设置。
对于输入框的删除按钮,可以用Offstage这种Flutter特有的控制显示隐藏的控件。
Q2: Flutter获取的OverlayState来自哪里?
当在flutter中做一个全局的Toast,loading,Alert的时候,会使用到OverlayEntry,只要通过OverlayState.insert()就能展示在界面上。如此好用那OverlayState又是从哪来的呢?
首先,获取OverlayState可以直接调用OverlayState overlayState = Overlay.of(context);直接就拿context去找了:OverlayState result = context.findAncestorStateOfTypeOverlayState();
能找到?怎么就找到了呢
那看下Overlay的注释:
尽管您可以直接创建一个[Overlay],但最常见的是使用[WidgetsApp]或[MaterialApp]中的[Navigator]创建的。导航器使用其overlay来管理路由的视觉外观。
其中很关键的点在Navigator,那去找Navigator,顺便还找到了Route。
Navigator中一层结构就是Overlay。那看下Flutter中导航到底是怎么做的。
许多应用程序在其小部件层次结构的顶部附近都有一个导航器,以便使用[Overlay]来显示它们的逻辑历史,其中最近访问的页面可视化地位于较旧页面的顶部。通过使用此模式,导航器可以通过在覆盖图中移动小部件从一个页面可视地过渡到另一个页面。
既然Overlay从导航而来,那App中怎么就有导航呢?
Flutter创建的的时候,main里面的入口runApp(),在视图的最底层会写一个MaterialApp().
找到MaterialApp。
那就找在哪创建了Navigator。没找到,但是在return时用的是WidgetsApp,看下介绍。
WidgetsApp定义了基本的应用程序元素,但不依赖于Material库,也就是MaterialApp是对WidgetsApp的上层封装,为我们集成了Material元素。继续找WidgetsApp。
在build里面创建了Navigator。
那么流程就是:MaterialApp —— WidgetsApp —— Navigator。
Overlay.of(context)拿到了Navigator里面的OverlayState.
flutter最上层的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于flutter上下滑动切换、flutter最上层的信息别忘了在本站进行查找喔。





