概述

#

一个新的 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 存在缺陷,它没有强制连接到引擎的 Activity 之间进行排他性,从而导致 Activity 与引擎之间出现 n:1 关系,并引发生命周期交叉通信问题。

变更说明

#

Issue #21272 之后,您不再需要使用以下 API 将您的 activity 附加到 FlutterEngine

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

API(现已废弃),而是使用

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

现在期望使用 ExclusiveAppComponent<Activity> 接口而不是 Activity。当您的独占 Activity 被附加到 FlutterEngine 的另一个 Activity 替换时,ExclusiveAppComponent<Activity> 会提供一个回调。

java
void detachFromActivity();

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

迁移指南

#

如果您有自己的 activity 持有 FlutterView,请将对以下方法的调用替换为

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

对以下方法的调用:

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

在您通过调用 FlutterEngine 上的 getActivityControlSurface() 获取的 ActivityControlSurface 上进行调用。

使用 ExclusiveAppComponent<Activity> 包装您的 Activity 并实现回调方法

java
void detachFromFlutterEngine();

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

时间线

#

版本发布:1.23.0-7.0.pre
稳定版本:2.0.0

参考资料

#

相关错误:Issue #66192 — 连接到 FlutterEngine 的非独占 UI 组件导致事件交叉通信