alibaba / alibaba/flutter_boost
flutter插件内获取Activity实例错误
- 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