大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
现象:
目前创新互联已为上千家的企业提供了网站建设、域名、雅安服务器托管、网站托管、服务器租用、企业网站设计、翁源网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
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时再移除这个蒙层。
打印结果为
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() 之前,先操作子类在操作父类。
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传送门