flutter意义,flatter和flutter

飘的含义是什么

动词

创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站建设、做网站、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的江岸网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

1.(随风摇动或飞扬)wave to and fro; float (in the air); flutter

名词

1.Gone with the Wind 《飘》

繁体:飃,飘

飘 piāo (动)随风摇动或飞扬:

~带|~荡|~落|~然|~舞|~溢|~悠|轻~|风雨~摇|虚~。

(1)(形声。从风,票声。本义:旋风;暴风) 同本义 [whirlwind;strong wind; storm wind]

(2)又如:飘风(旋风);飘骤(疾风骤雨。比喻事物突然骤起);飘风骤雨(突然而来的旋风暴雨)

flutter中流式布局

流式布局(Liquid)的特点(也叫"Fluid") 是页面元素的宽度按照屏幕分辨率进行适配调整,但整体布局不变。栅栏系统(网格系统),用户标签等。在Flutter中主要有Wrap和Flow两种Widget实现。

在介绍Row和Colum时,如果子widget超出屏幕范围,则会报溢出错误,在Flutter中通过Wrap和Flow来支持流式布局,溢出部分则会自动折行。

上述有很多属性和Row的相同,其意义其实也是相同的,这里我就不一一介绍了,主要介绍下不同的属性:

我们一般很少会使用Flow,因为其过于复杂,需要自己实现子widget的位置转换,在很多场景下首先要考虑的是Wrap是否满足需求。Flow主要用于一些需要自定义布局策略或性能要求较高(如动画中)的场景。Flow有如下优点:

我们对六个色块进行自定义流式布局:

实现TestFlowDelegate:

可以看到我们主要的任务就是实现paintChildren,它的主要任务是确定每个子widget位置。由于Flow不能自适应子widget的大小,我们通过在getSize返回一个固定大小来指定Flow的大小,实现起来还是比较麻烦的。

风+汤(去掉三点水),念什么?

飏,音yang,音同“扬”。动词。意义:(1) 飞扬;飘扬;(2) 通“扬”。

flutter 网络请求dio的简单使用以及请求头参数的自定义

dio的使用方式有很多,我就只选出我认为最好用的api方式做下记录,把get成post就是post请求了,网络请求都用的百度的api,实际上的response没有任何意义,所以只要打印出response有值即可。

1.最简单的请求例子,网络请求是异步的所以用async await

2.带有参数的get请求

3.自定义请求头,可定义的请求头dart已经为我们提供了专门的类存了对应的字符,引入以下库,就能使用 HttpHeaders

一般我们请求接收到的数据是json格式,如'accept: application/json',我们就可以这样自定义请求头

4.使用Baseoptions

其他详细参数设置参考如下:

关于flutter NestedScrollView导致其body的tabbarview的多个list同步滚动的解决方案

讲道理我起的好长的名字啊,不过文如上题,搜索到这里的兄弟应该都知道我说的是啥情况,正好

~~

我这个方案可能有点笨拙TT,不过自测有效,有其它想法的老哥希望可以帮忙指点一下~

下面进入正题

点进源码里面看,可以发现他直接继承了StatelessWidget,那我们就直接看看build方法

可以看到,这里直接返回一个scrollable或者一个子节点是scrollable的InheritedWidget

scrollable是一个StatefulWidget,那我们就看看它的state

首先scrollable持有一个scrollposition对象,是通过其scrollcontroller构建的

在其state的setCanDrag方法中,对其拖动设置了一系列的监听

这里就可以看出来,当拖动触发时,就会通过当前scrollable的position生成一个Drag/Hold对象,并调用相应的方法 这个position有几个子类,我们先随便看一个实现

可以看到生成了一个ScrollDragController对象,当手势拖动而调用这个对象的update方法时

可以看到直接调用其委托对象的applyUserOffset方法进行偏移,而这个委托对象根据刚才的drag方法可以得知正是我们scrollable中的position

最后,由position通知其scrollcontext,也就是之前的scrollable进行滑动

具体的滑动流程这里就不细说了,我们只是要知道这个事件是怎么传递的就好了,有兴趣的老哥可以自行分析

NestedScrollView是一个statefulwidget,那我们就先看看它的build方法

先忽略其他奇奇怪怪的方法,我们发现在我们body的外面,包裹了一层PrimaryScrollController,同时它还持有innerController,这个innerController暂时先不管它是啥

还记不记得在最开始ScrollView的build方法中,生成Scrollable的时候,我们已经见过这个PrimaryScrollController了,再回顾一下

再看看PrimaryScrollController.of(context)

可以看到,在生成scrollable的时候,在primary = true的情况下是会向上查找的,看看有没有PrimaryScrollController,如果有的话,scrollable使用的controller实际就是nestedscrollview中的innerController了

而之前看过了,scrollable中的position就是scrollcontroller来生成的,那么在这种情况下:

实际上是生成了_NestedScrollPosition并返回给了body中的scrollable

构造方法中有一个参数coordinator 暂时先不管

好了,下面我们在回头看刚才NestedScrollView的build方法,实际上是生成了一个_NestedScrollViewCustomScrollView,继承自大名鼎鼎的CustomScrollView,它当然也是scrollview啦,而我们传给它的controller也是一个_NestedScrollController,不过叫做_outerController,和body中的不是同一个罢了,那么自然这个父scrollview的position也是_NestedScrollPosition。

下面我们按照之前的逻辑,当拖动开始时,就会调用position.drag方法

可以看到,实际上吧方法交给了我们之前多次见到的coordinator来完成,那我们就简单看一下吧

这里可以看到,他把返回的ScrollDragController的委托者设成了自己

那么自然在拖动的时候,调用的就是coordinator的applyUseroffset方法了 我们分析一下

可以看到,在需要子列表滚动时,是对innerPositions中的所有position调用滑动方法的

而这innerPositions中的position是怎么来的呢?跟踪一下可以发现是在调用NestedScrollController的attach时添加进来的,如下

因为之前我们看到过,子scrollable中的controller就是这个NestedScrollController,所以在updateopsition时会把旧的detach调,把新生成的position attach进来

另外,在dispose中也会detach

由此我们就知道啦,因为开启了缓存后就不会调用划出屏幕的页面的dispose,自然所有子scrollable的position都存在nestedScrollController里面了,当发生滑动时,遍历调用positions数组,就导致屏幕外的列表也跟着滑动了~

既然开启了缓存,手动dispose肯定是没啥意义的,实际上我们只要在页面切换过后把未显示的position 给detach掉就好了。

然鹅,因为flutter不支持反射,子布局传递的position我们拿不到,nestedScrollController我们也不能直接拿到=。=

不过有一个对象我们之前见到过,scrollable就是通过他获取controller的,而position则是传给了获取到的controller 就是PrimaryScrollController了,所以我打算在中间第三者插足,对传递Position的PrimaryScrollController进行Hook

在使用的时候把子列表添加进去,并设置对应的GlobalKey。

然后监听Tab切换

以上是我的方案,有问题的话还希望老哥帮忙指正,也希望有其他思路的老哥指点一下~~

上一下Github项目地址 用Flutter写的WanAndroid 其中用到了这个方案

= =

3


分享文章:flutter意义,flatter和flutter
分享地址:http://pwwzsj.com/article/dsdseoc.html