flutter重写,简书 flutter

flutter跳转原生页面后的穿透问题

现象:

目前创新互联已为上千家的企业提供了网站建设、域名、雅安服务器托管、网站托管、服务器租用、企业网站设计、翁源网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

flutter页面通过present跳转原生页面后,原生页面上的点击会首先响应下面的flutter页面中的内容(比如按钮什么的)。

这是flutter框架一直存在的一个bug。在github上有相关的issue。

原因推测:

推测是flutter对控制器(或者view)加了分类,重写了控制器的点击事件,用来计算是否在对应的点击位置有flutter响应事件。没有的话再扔出去点击事件。

解决方案1:

在原生控制器中,加入点击事件的几个方法的空实现,用以覆盖flutter框架中的实现:

-(void)touchesBegan:(NSSetUITouch * *)touches withEvent:(UIEvent *)event{

}

-(void)touchesMoved:(NSSetUITouch * *)touches withEvent:(UIEvent *)event{

}

-(void)touchesCancelled:(NSSetUITouch * *)touches withEvent:(UIEvent *)event{

}

-(void)touchesEnded:(NSSetUITouch * *)touches withEvent:(UIEvent *)event{

}

让事件不被flutter截获即可。

解决方案2:

直接切换window的根控制器到原生控制器即可。别忘暂时保存flutter控制器。

在返回时再切换回flutter中。

解决方案3:

在flutter跳转到原生页面之前,在flutter中加上一个蒙层,用来隔绝手势往flutter下面的view传递。原生页面返回flutter时再移除这个蒙层。

Flutter StatelessWidget和StatefulWidget生命周期

打印结果为

1、widget的 构造方法

2、widget的 createState 方法

3、state的 构造方法

4、state的 initState 方法,(重写该方法时,必须要先调用 super. initState() )

5、 didChangeDependencies方法 ,分两种情况:

(5.1)、调用 initState 方法后,会调用该方法,

(5.2)、从其他 widget 中依赖一些 数据发生改变 时,比如用 InheritedWidget , provider 来监听数据的改变)

6、state的 build方法 (当调用 setState 方法,会重新调用 build 进行渲染)

7、state的 deactivate 方法(当state被暂时从视图移除的时候会调用,页面 push 走、 pop 回来的时候都会调用。因为push、pop会改变widget在视图树位置,需要先移除再添加。重写该方法时,必须要先调用 super.deactivate() )

8、state的 dispose 方法。页面被销毁的时候调用,如: pop 操作。通常情况下,自己的释放逻辑放在 super.dispose() 之前,先操作子类在操作父类。

flutter Set集合妙用

Set是不能重复的集合,所以可以用Set去重;

String、int、double类型示例,如下:

String类型:

int类型:

double类型:

可以看到, Set集合可直接对String、int、double类型去重 ;

Map、List、bool类型和String、int、double类型对比示例,如下:

可以看到,当自定义对象实例化为同一个对象时,Set会过滤掉同一个实例化的对象;当自定义对象实例化为不同对象时,Set不会去重,即使对象数据内容一样,这不符合我们的业务;

可以看到,重写自定义对象==方法,Set还是不能去重;

上面重写自定义对象hashCode和==方法,以title不同区分不同对象;

可以看到,重写自定义对象hashCode和==方法,Set集合对自定义对象去重才有效;并且Set集合里有相同对象时(相同对象为上面自定义对象title值相同的对象),后面相同的对象就不会被加入Set集合里了( 如上面title一样,boolValue不一样,这样被认为相同的对象,因为重写自定义对象hashCode和==方法,以title不同区分不同对象;Set集合里最开始加入的TestModel('a', boolValue: false),数据不会被相同对象TestModel('a', boolValue: true)覆盖 )。

网上介绍flutter Set集合时一般会介绍Set没有顺序,这点不太理解,可能是不能通过索引来获取对应的值吧,像Java语言的Set集合确实是无序的,但flutter的Set集合保持着子元素的有序性。 如下:

可以看到,将Set通过toList()方法转为List后,List里子元素的顺序和子元素插入Set集合的顺序是一致;对于自定义对象亦是如此,可自行验证。

为什么Set集合会保持子元素插入顺序呢

我们看下Set源码,如下:

从源码我们可知,Set()是一个工厂构造方法,根据工厂构造方法的特点,Set是由LinkedHashSet实例化的。

从上面注释可知,HashSet是无序的,LinkedHashSet保持着子元素插入的顺序。而Set是由LinkedHashSet实例化的,所以Set保持着子元素插入的顺序。

如想要深入分析LinkedHashSet,LinkedHashSet源码中有很多external声明的方法,可参考 如何找到flutter external声明方法的实现

demo传送门


网站栏目:flutter重写,简书 flutter
地址分享:http://scyanting.com/article/hogiid.html