flutter传递路由,flutter数据传递

flutter pushname使用和多参数传递

配置routes参数

公司专注于为企业提供成都做网站、网站建设、微信公众号开发、商城网站建设,小程序开发,软件按需网站建设等一站式互联网企业服务。凭借多年丰富的经验,我们会仔细了解各客户的需求而做出多方面的分析、设计、整合,为客户设计出具风格及创意性的商业解决方案,成都创新互联更提供一系列网站制作和网站推广的服务。

main函数:

使用

单参数

多参数

参考了: Flutter命名路由及传参的深度实践与解读 ;

4.Flutter生命周期与路由管理

flutter也有自己的生命周期,不像Android中Application、Activity、Fragment生命周期分得这么明细,flutter中只在StatefulWidget维护的State中维护了5个生命周期函数(可用于App中的页面跳转,相当于Android中View的生命周期)。而Activity中的生命周期可以通过实现WidgetsBindingObserver 接口,在didChangeAppLifecycleState()中获取状态回调。

initState()--didChangeDependencies()--deactivate()--dispose() didUpdateWidge()

1.Widget A打开Widget B: 调用 Navigator.push(B)

2.Widget B从Widget A退出: 调用Navigator.pop()

可以看出, Flutter打开、关闭Widget时跟安卓、iOS的时序一样, 都是先处理即将显示的界面。

Flutter提供了WidgetsBindingObserver来监听AppLifecycleState, 而AppLifecycleState有4种状态:

1、 resumed 界面可见, 同安卓的onResume。

2、inactive界面退到后台或弹出对话框情况下, 即失去了焦点但仍可以执行drawframe回调;同安卓的onPause;

3、paused应用挂起,比如退到后台,失去了焦点且不会收到 drawframe 回调;同安卓的onStop;

4、suspending, iOS中没用,安卓里就是挂起,不会再执行 drawframe 回调;

5、关于drawframe回调:Vsync信号到来之后,Engin会按顺序回调 window 的两个回调函数: onBeginFrame() 和 onDrawFrame() 。这两个回调是 SchedulerBinding 初始化的时候设置给 window 的。对应的是 SchedulerBinding.handleBeginFrame() 和 SchedulerBinding.handleDrawFrame() 。

应用场景:

1、初次打开widget时,不执行AppLifecycleState的回调;

2、按home键或Power键, AppLifecycleState inactive----AppLifecycleState pause

3、从后台到前台:AppLifecycleState inactive---ApplifecycleState resumed

4、back键退出应用: AppLifecycleState inactive---AppLifecycleState paused

Flutter(六)Android与Flutter混合开发(Hybird)

如果我们目前的项目是Android的,但是接下来我们希望部分页面可以使用Flutter进行开发,甚至我们希望在Native页面中嵌入FlutterUI组件,那么我们该如何实现呢?

假设你现在Android项目的目录的结构是这样的

这时候如果你想创建一个Flutter模块,使得Android模块和Flutter模块之间可以进行交互,我们可以通过Android Studio新建一个Flutter Module,具体过程是:File — New — New Module ,之后选择Flutter Module,指定Project Location的路径为

也就是说,最终你的项目结构会是这样的

接下来在Android Module的 build.gradle 文件中添加flutter依赖

先创建一个Flutter页面

这里比较重要的是 window.defaultRouteName 这个字段,这个字段可以接收从Native传递过来的参数 (下文我们会介绍原生传递参数的方法),也就是说通过这个字段我们就可以进行Flutter页面的路由的分发

我们可以直接在Android的 MainActivity 中启动一个 FlutterActivity ,这里的 initialRoute 方法中传递的参数就对应Flutter层的 window.defaultRouteName

注意:需要在 AndroidManifest.xml 注册 FlutterActivity

自己创建一个 FlutterAppActivity 继承自 FlutterActivity

在 MainActivity 中启动 FlutterAppActivity (另外别忘了在 AndroidManifest.xml 中注册 FlutterAppActivity )

两种启动方式的区别

如果单纯只是想打开一个Flutter页面,两种方式实际上基本没有太大区别,第一种方式也许还会更简单一点。但是,在Flutter开发中,我们往往还需要开发一些Native插件供Flutter调用,如果使用复写 FlutterActivity 的方式更有利于我们在 FlutterActivity 中注册我们的Native插件,所以实际开发中一般推荐使用第二种方式

扩展思考

initialRoute 从名称上看起来是Flutter提供给我们进行Native与Flutter交互的路由跳转的,但是实际上他就是一个字符串,我们不仅仅可以传递一个路由名称,有时候我们也可以通过这个参数传递一串JSON数据,然后在Flutter端进行解析,这样我们就可以通过这个参数做更多的事情

activity_main.xml

FrameLayout 用于承载Flutter组件

MainActivity.java

使用 FragmentManager 将 FlutterFragment 添加到 FrameLayout 容器中

运行结果

上半部分是原生的TextView,下半部分是Flutter的Text组件

本节主要介绍了Native和Flutter之间的页面跳转,以及同一个页面中Native与Flutter组件的组合。接下来会介绍如何编写Android插件与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跨组建传递数据的三种方式

背景:flutter组件嵌套都很深,依次传递数据很麻烦,所以最好是能够跨组件传递。有三张跨组件的方式:InheritedWidget、Notification、Eventbus.

是一种自上而下的传递数据的方式。

使用步骤:

它的数据流动方式和InheritedWidget刚好相反,从子控件向上面传递。

具体使用

跟android 原生的eventbus原理和使用一样。


网页名称:flutter传递路由,flutter数据传递
网页网址:http://scyanting.com/article/dsgjsod.html