alibaba / alibaba/flutter_boost

flutter插件内获取Activity实例错误

Open
#913 4 comments 10 reactions 0 assignees View on GitHub
Android
Dominant language
Dart
Stars
7.2k
Forks
1.3k
PR merge metrics
No merged PRs in 30d

Description

从一个flutter-A页面跳转到一个antive-B页面,再次跳转一个flutter-C页面,之后从C依次返回到B->A页面,发现这时候在A页面的插件内获取到的Activity实例时activityPluginBinding为空,重复这个操作,第二次在A页面获取activityPluginBinding内的Activity实例为C页面的实例(Flutter页面)。
我简单查了一下原因,是因为从C返回B的时候走了C页面的onDestroyView把BoostRegistrarAggregate内的activityPluginBinding清空了,同时把isWaitingForActivityReattachment变为了true

void onDestroyView() {
Log.v(TAG, "onDestroyView()");
mSyncer.onDestroy();

ensureAlive();
BoostPluginRegistry registry = (BoostPluginRegistry) FlutterBoost.instance().getPluginRegistry();
if (registry != null) {
ActivityPluginBinding binding = registry.getRegistrarAggregate().getActivityPluginBinding();
if (binding != null && (binding.getActivity() == this.host.getActivity())) {

registry.getRegistrarAggregate().onDetachedFromActivityForConfigChanges();

flutterEngine.getActivityControlSurface().detachFromActivityForConfigChanges();

}
}
flutterView.release();
}

public void onDetachedFromActivityForConfigChanges() {
Iterator var1 = this.shimRegistrars.iterator();

while (var1.hasNext()) {
BoostRegistrar shimRegistrar = (BoostRegistrar) var1.next();
shimRegistrar.onDetachedFromActivity();
}

this.activityPluginBinding = null;
}

再次回到A页面的时候onResume方法时,binding为null,导致不能执行attachToActivity方法,从而无法在插件内获取到对应的正确的Activity。

void onResume() {
if (isResumed) {
return;
}
isResumed = true;
isPaused = false;

Logger.log("Delegate onResume");
mSyncer.onAppear();

Log.v(TAG, "onResume()");
ensureAlive();
flutterEngine.getLifecycleChannel().appIsResumed();

BoostPluginRegistry registry = (BoostPluginRegistry) FlutterBoost.instance().getPluginRegistry();
ActivityPluginBinding binding = registry.getRegistrarAggregate().getActivityPluginBinding();
if (binding != null && (binding.getActivity() != this.host.getActivity())) {
flutterEngine.getActivityControlSurface().attachToActivity(
host.getActivity(),
host.getLifecycle()
);
}

}

我看了官方flutter的engin的代码在他们的master的分支已经把onAttachedToActivity和onReattachedToActivityForConfigChanges两个方法实现改为一致了。咱们的boost是不也应该升级一下了?

@Override
public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) {
activityPluginBinding = binding;
for (ShimRegistrar shimRegistrar : shimRegistrars) {
shimRegistrar.onAttachedToActivity(binding);
}
}

@Override
public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) {
activityPluginBinding = binding;
for (ShimRegistrar shimRegistrar : shimRegistrars) {
shimRegistrar.onReattachedToActivityForConfigChanges(binding);
}
}

Contributor guide

No contributing guide indexed for this repository

Research direction

Start in the Android integration points named in the report: onDestroyView(), onResume(), BoostRegistrarAggregate.onDetachedFromActivityForConfigChanges(), and the attach/re-attach callbacks. Reproduce the Flutter-A → native-B → Flutter-C navigation sequence, then verify that returning to A restores the correct ActivityPluginBinding and Activity rather than leaving the binding null or pointing to C.

Written by the indexing model from the issue text.

Assessment

Tech stack
android, dart, java
Domain
mobile-dev
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
30/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.