概述

#

一個新方法 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 元件導致事件交叉干擾