返回

Flutter新锐专家之路:混合开发篇

IOS

Flutter新锐专家之路:混合开发篇

正文:

Flutter是一项跨平台开发技术,可以帮助您使用相同的代码库为多个平台构建应用程序。这使得开发应用程序变得更加容易,因为您不必为每个平台编写单独的代码库。

混合开发是将Flutter与原生开发技术结合起来进行开发。这允许您在同一项目中同时使用Flutter和原生代码,从而实现业务需求。例如,您可以使用Flutter来构建应用程序的用户界面,而使用原生代码来实现需要访问硬件的功能。

在引入Flutter之后,我们首要面临的问题便是混合栈的管理。假设我们首先实践的是商品详情页,则会有一个常见的应用场景:

  1. 首页
  2. 详情页
  3. 详情页(猜你喜欢点击进入的商品)

其中,主页和第一个详情页为Flutter页面,第二个详情页为原生页面。

在这种场景中,很容易遇到栈内存泄漏的问题。因为Flutter和原生页面之间是互相持有的关系,当切换页面时,页面被销毁,但是由于互相持有,Flutter页面并不会被释放。随着页面切换越来越频繁,内存使用会越来越大,最终导致内存溢出。

解决这个问题的办法也很简单,便是只持有,不引用。这里举一个例子,现在有两个页面,分别为A页面和B页面,都处于栈中。在跳转的瞬间,将栈顶的A页面remove,然后将B页面push进去。等B页面准备推出的时候,再将B页面remove掉。这样便解决了内存泄漏的问题。

接下来,我们就要处理混合下的能力补齐和包管理了。一般而言,Flutter页面和原生页面会进行深度融合。这就需要两边都暴露同样的接口,互相调用。然而,在实际开发中,常常会遇到两边方法签名和参数不一致的问题。

在两种语言间函数或者方法的参数不一致的情况下,我们可以进行转换。例如,Flutter暴露一个接口,需要传入一个map,而原生页面只能传入一个json。那么,我们可以对参数进行转换。

在Flutter中使用下面代码:

Map<String, dynamic> map = new Map();
// ...add elements to the map
String json = jsonEncode(map);

而在原生页面中使用下面代码:

JSONObject jsonObject = new JSONObject(json);

这样就可以实现数据转换。

另外,还需要注意混合项目下包管理的问题。一般来说,Flutter项目的依赖都在pubspec.yaml中。然而,Flutter和原生开发的依赖是分开的。因此,原生开发的依赖需要加入原生的build.gradle中。在Flutter项目下,可以在Android目录下的build.gradle中加入下面内容:

dependencies {
    // ...your dependencies
    implementation platform('com.android.tools.build:gradle:4.1.1')
    implementation 'com.android.support:appcompat-v7:28.0.0'
}

这样做的好处是,可以在同一项目中管理Flutter和原生项目的依赖,方便项目的管理。

最后,让我们来总结一下Flutter混合开发的步骤:

  1. 引入Flutter SDK并安装Flutter插件
  2. 创建一个Flutter项目
  3. 添加Flutter到原生项目中
  4. 管理混合栈
  5. 补齐混合下的能力
  6. 管理混合项目的包

通过本文,您应该对Flutter混合开发有了一个基本的了解。如果您想了解更多关于Flutter混合开发的信息,可以查阅Flutter官方文档。

希望这篇博文对您有所帮助!