概述

#

一个新方法 ActivityControlSurface

java
void attachToActivity(
    @NonNull ExclusiveAppComponent<Activity> exclusiveActivity,
    @NonNull Lifecycle lifecycle);

正在取代已弃用的方法

java
void attachToActivity(@NonNull Activity activity, @NonNull Lifecycle lifecycle);

带有 Activity 参数的现有已弃用方法已在 Flutter 2 中移除。

背景

#

为了让自定义 Activities 也能使用 ActivityAware 接口向 Flutter 插件提供 Activity 生命周期事件,FlutterEngine 暴露了一个 getActivityControlSurface() API。

这允许自定义 Activities 向引擎(它与引擎之间存在 (0|1):1 的关系)发出信号,表明它已被附加或分离。

然而,之前的 API 存在一个缺陷,它没有强制执行活动连接到引擎之间的排他性,从而允许活动和引擎之间存在 n:1 的关系,导致生命周期交叉干扰问题。

变更说明

#

Issue #21272 之后,请不要再使用以下方式将您的活动附加到 FlutterEngine

java
void attachToActivity(@NonNull Activity activity, @NonNull Lifecycle lifecycle);

API,它已被弃用,而是使用:

java
void attachToActivity(
    @NonNull ExclusiveAppComponent<Activity> exclusiveActivity,
    @NonNull Lifecycle lifecycle);

现在需要的是一个 ExclusiveAppComponent<Activity> 接口,而不是一个 ActivityExclusiveAppComponent<Activity> 提供了一个回调,以防您的排他性活动被另一个附加到 FlutterEngine 的活动替换。

java
void detachFromActivity();

API 保持不变,当您的自定义活动自然销毁时,您仍然需要调用它。

迁移指南

#

如果您有自己的活动持有 FlutterView,请将调用

java
void attachToActivity(@NonNull Activity activity, @NonNull Lifecycle lifecycle);

替换为调用

java
void attachToActivity(
    @NonNull ExclusiveAppComponent<Activity> exclusiveActivity,
    @NonNull Lifecycle lifecycle);

在通过 getActivityControlSurface()FlutterEngine 上获取的 ActivityControlSurface 上。

将您的活动包装在 ExclusiveAppComponent<Activity> 中,并实现回调方法

java
void detachFromFlutterEngine();

以处理您的活动被另一个附加到 FlutterEngine 的活动替换的情况。通常,您需要执行与活动自然销毁时相同的分离操作。

时间线

#

已合并版本:1.23.0-7.0.pre
稳定版本:2.0.0

参考资料

#

驱动此问题的 Bug:Issue #66192—附加到 FlutterEngine 的非独占 UI 组件导致事件交叉干扰