Flutter为什么需要做混合栈管理

0x00 前言

Flutter和Android都有自己的页面管理功能。

在纯Android或者纯Flutter工程中,页面都由各端全权处理,没什么问题。

如果是Android和Flutter混合工程,尤其是遇到页面互相穿插的情况下,

比如native page1->flutter page1->native page2->flutter page2这样,

这就有问题了。

先看看Android如何打开Flutter页面,然后再看有什么问题。

0x01 Android跳转Flutter

Android端

Android和Flutter是宿主与寄生的关系。

Android每启动一个FlutterActivity就会创建一个FlutterEngine实例,同时也会运行Flutter。

通过命令行我们可以看到不管我们的Flutter页面如何切换,命令行我们看到的Activity只有

MainActivity这一个。

也就是所有的Flutter页面操作都是在MainActivity中完成的,

具体点是MainActivity中的FlutterView。

所以从Android跳转到Flutter页面,

一个比较直接的方法是从新启动一个FlutterActivity,然后我们指定一个要在Flutter端启动的页面。

Android端

首先在androidManifest.xml中声明FlutterActivity:

<activity
            android:name="io.flutter.embedding.android.FlutterActivity"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize" />

其次,点击事件跳转时使用FlutterActivity的静态方法跳转:

findViewById<Button>(R.id.btn).setOnClickListener {
            startActivity(FlutterActivity.withNewEngine().initialRoute("third_page").build(this))
        }

Flutter端

Android端设置了initialRoute

如果Flutter端不处理,默认启动后还是会显示Home的页面。

所以Flutter端需要对initialRoute进行处理:

通过window.defaultRouteName获取之前设置的initialRoute

根据initialRoute返回不同的Widget:

Widget _initHome() {
  final routeName = window.defaultRouteName;
  if (routeName == '/') {
    return ScopedHomePage();
  } else if (routeName == 'third_page') {
    return ThirdPage();
  }
}

0x02问题分析

多FlutterEngine实例

由于多次页面穿插,导致系统创建多个Engine实例。

FlutterEngine是一个比较重的对象,创建耗费时间比较大,

所以在调用FlutterActivity.withNewEngine().initialRoute("third_page").build(this)时会有白屏现象。

另外一些对象是存在Engine中的,如果每个Engine中都保存一份相同对象,那么内存是成倍增加的。

Plugin混乱

如果启动了多个FlutterActivity,那么每个FlutterActivity都注册了一些Plugin的话,

这会造成Plugin注册混乱,维护困难。

结尾

对于大型App来说混合开发很常见,所以不可避免的会遇到上面的问题。

也就会逃不过要做混合栈处理。

关于混合栈处理可以使用flutterboost

评论列表,共 0 条评论

    暂无评论