Saltar al contenido principal

Cambio de firma de Android ActivityControlSurface attachToActivity

El parámetro activity de attachToActivity cambió a ExclusiveAppComponent en lugar de Activity.

Resumen

#

Un nuevo método de ActivityControlSurface:

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

está reemplazando al método ahora obsoleto:

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

El método obsoleto existente con el parámetro Activity se eliminó en Flutter 2.

Contexto

#

Para que las Activities personalizadas también proporcionen los eventos del ciclo de vida de la Activity que los plugins de Flutter esperan utilizando la interfaz ActivityAware, el FlutterEngine expuso una API getActivityControlSurface().

Esto permite que las Activities personalizadas indiquen al motor (con el cual tiene una relación (0|1):1) que se está acoplando o desacoplando del motor.

Sin embargo, la API anterior tenía el defecto de que no imponía la exclusión entre las actividades que se conectaban a engine, lo que permitía relaciones de n:1 entre la actividad y engine, causando problemas de interferencia en el ciclo de vida.

Descripción del cambio

#

Después de la Issue #21272, en lugar de acoplar tu activity al FlutterEngine mediante el uso de:

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

API, que ahora está obsoleta; en su lugar usa:

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

Ahora se espera una interfaz ExclusiveAppComponent<Activity> en lugar de una Activity. La interfaz ExclusiveAppComponent<Activity> proporciona una devolución de llamada (callback) en caso de que tu activity exclusiva esté siendo reemplazada por otra activity que se acople al FlutterEngine.

java
void detachFromActivity();

La API permanece sin cambios y todavía se espera que la llames cuando tu actividad personalizada se destruya de forma natural.

Guía de migración

#

Si tienes tu propia activity que contiene un FlutterView, reemplaza las llamadas a:

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

con llamadas a:

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

en el ActivityControlSurface que obtuviste al llamar a getActivityControlSurface() en el FlutterEngine.

Envuelve tu activity con un ExclusiveAppComponent<Activity> e implementa el método de callback:

java
void detachFromFlutterEngine();

para manejar el reemplazo de tu activity por otra activity que se esté acoplando al FlutterEngine. Generalmente, querrás realizar las mismas operaciones de desacoplamiento que se realizan cuando la activity se destruye de forma natural.

Timeline

#

Introducido en la versión: 1.23.0-7.0.pre
En la versión estable: 2.0.0

Referencias

#

Bug motivador: Issue #66192—Los componentes de UI no exclusivos acoplados al FlutterEngine causan interferencias de eventos