NA嵌入Flutter页面,android音视频开发书籍

本文详细探讨了如何在Android原生应用(NA)中嵌入Flutter页面,包括使用FlutterFragment和FlutterActivity的方式,以及处理生命周期、传参等问题。同时,文章提到了Android音视频开发相关的书籍,暗示了作者可能在该领域有深入研究。
摘要由CSDN通过智能技术生成
  • 执行的FlutterEngineCache.getInstance().put(“my_engine_id”, flutterEngine)就是将FlutterEngine缓存起来,这里传入的"my_engine_id"就相当于缓存名称。

  • 之后调用FlutterFragment.withCachedEngine(“my_engine_id”).build();获取缓存的FlutterFragment对象

  • NA添加FlutterFragment

  • 在NA创建一个Activity,在onCreate中创建FlutterFragment然后添加到布局中。

  • Flutter.createFragment()方法传入的参数同样表示路由名称,用于确定Flutter要显示的Widget,返回一个FlutterFragment,该类继承自Fragment,将该Fragment添加到Activity中就可以了。

private void addFlutterView() {

// 通过FlutterFragment引入Flutter编写的页面

// 通过FlutterFragment.createDefault()创建出FlutterFragment

// 需要注意这里的FlutterFragment位于io.flutter.embedding.android包中

//FlutterFragment flutterFragment = FlutterFragment.createDefault();

// 通过FlutterFragment.withNewEngine()获取到NewEngineFragmentBuilder对象

FlutterFragment.NewEngineFragmentBuilder fragmentBuilder = FlutterFragment.withNewEngine();

// 使用建造者模式构造出FlutterFragment对象,可以通过initialRoute()方法指定初始路由名称。

// 传递参数只需要在路由名称后面进行拼接。

FlutterFragment.NewEngineFragmentBuilder initialRoute = fragmentBuilder.initialRoute(“yc”);

FlutterFragment flutterFragment = initialRoute.build();

getSupportFragmentManager()

.beginTransaction()

.add(R.id.rl_fl
utter, flutterFragment)

.commit();

// 存在的问题

// 使用的withNewEngine()方法从名称上也能看出每次都是创建一个新的FlutterEngine对象来显示Flutter UI,

// 但是从官方文档中我们可以了解到每个FlutterEngine对象在显示出Flutter UI之前

// 是需要一个warm-up(不知道能不能翻译为预热)期的,这会导致屏幕呈现短暂的空白,

// 解决方式就是预先创建并启动FlutterEngine,完成warm-up过程,然后将这个FlutterEngine缓存起来,

// 之后使用这个FlutterEngine来显示出Flutter UI。

// 解决方案看:FlutterFragmentCachedActivity

// 如何获取到FlutterEngine对象呢?FlutterFragment中定义了一个getFlutterEngine()方法,

// 从方法名来看大概就是获取FlutterEngine对象。

// 尝试过创建MethodChannel时传入flutterFragment.getFlutterEngine().getDartExecutor(),

// 运行后会直接抛出空指针异常,异常产生的位置在FlutterFragment的getFlutterEngine()方法中

// 错误原因是这里的delegate为null,全局搜索一下,发现在FlutterFragment的onAttach()方法中会对delegate赋值,也就是说明此时没有执行onAttach()方法。

// 猜测这就是由于上面提到过的FlutterEngine的warm-up机制,这是一个耗时过程,

// 因此FlutterFragment并不会立刻执行onAttach()方法,导致我们在Activity的onCreate()方法中直接使用FlutterFragment的getFlutterEngine()方法会抛出异常。

// todo 调用下面这句话会空指针崩溃

// FlutterEngine flutterEngine = flutterFragment.getFlutterEngine();

}

  • Flutter添加页面

  • 这个同上

3.3 使用新版本FlutterActivity

  • 原生引入Flutter页面方式

  • 使用FlutterActivity,这里的FlutterActivity也是位于io.flutter.embedding.android包下的。

<activity

android:name=“io.flutter.embedding.android.FlutterActivity”

android:configChanges=“orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode”

android:hardwareAccelerated=“true”

android:theme="@style/AppTheme"

android:windowSoftInputMode=“adjustResize” />

/**

  • 和介绍的创建FlutterFragment的三种方式是对应的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值