Don't hang to a platform view's input connection after it's disposed (flutter/engine#9423)

Addresses the crash reported in https://github.com/flutter/flutter/issues/19718#issuecomment-504174596
This commit is contained in:
Amir Hardon 2019-06-24 13:13:00 -07:00 committed by GitHub
parent ac90c31ae4
commit 110c63afaf
2 changed files with 19 additions and 1 deletions

View File

@ -237,6 +237,21 @@ public class TextInputPlugin {
return lastInputConnection;
}
/**
* Clears a platform view text input client if it is the current input target.
*
* This is called when a platform view is disposed to make sure we're not hanging to a stale input
* connection.
*/
public void clearPlatformViewClient(int platformViewId) {
if (inputTarget.type == InputTarget.Type.PLATFORM_VIEW && inputTarget.id == platformViewId) {
inputTarget = new InputTarget(InputTarget.Type.NO_TARGET, 0);
hideTextInput(mView);
mImm.restartInput(mView);
mRestartInputPending = false;
}
}
private void showTextInput(View view) {
view.requestFocus();
mImm.showSoftInput(view, 0);

View File

@ -135,8 +135,11 @@ public class PlatformViewsController implements PlatformViewsAccessibilityDelega
+ viewId);
}
contextToPlatformView.remove(vdController.getView().getContext());
if (textInputPlugin != null) {
textInputPlugin.clearPlatformViewClient(viewId);
}
contextToPlatformView.remove(vdController.getView().getContext());
vdController.dispose();
vdControllers.remove(viewId);
}