Avoid crash caused by flutterImageView be null (flutter/engine#34395)

This commit is contained in:
Nayuta403 2022-07-04 10:39:03 +08:00 committed by GitHub
parent f9609a4372
commit 438c737e98
2 changed files with 32 additions and 1 deletions

View File

@ -1308,6 +1308,11 @@ public class FlutterView extends FrameLayout
getContext(), getWidth(), getHeight(), FlutterImageView.SurfaceKind.background);
}
@VisibleForTesting
public FlutterImageView getCurrentImageSurface() {
return flutterImageView;
}
/**
* Converts the current render surface to a {@link FlutterImageView} if it's not one already.
* Otherwise, it resizes the {@link FlutterImageView} based on the current view size.
@ -1370,7 +1375,7 @@ public class FlutterView extends FrameLayout
public void onFlutterUiDisplayed() {
renderer.removeIsDisplayingFlutterUiListener(this);
onDone.run();
if (!(renderSurface instanceof FlutterImageView)) {
if (!(renderSurface instanceof FlutterImageView) && flutterImageView != null) {
flutterImageView.detachFromRenderer();
}
}

View File

@ -174,6 +174,32 @@ public class FlutterViewTest {
verify(imageViewMock, times(1)).closeImageReader();
}
@Test
public void flutterImageView_revertImageViewAndAvoidNPE() {
FlutterView flutterView = new FlutterView(ctx);
FlutterEngine flutterEngine = spy(new FlutterEngine(ctx, mockFlutterLoader, mockFlutterJni));
FlutterRenderer flutterRenderer = spy(new FlutterRenderer(mockFlutterJni));
when(flutterEngine.getRenderer()).thenReturn(flutterRenderer);
flutterView.attachToFlutterEngine(flutterEngine);
flutterView.convertToImageView();
assertTrue(flutterView.renderSurface instanceof FlutterImageView);
// Register a `FlutterUiDisplayListener` callback.
// During callback execution it will invoke `flutterImageView.detachFromRenderer()`.
flutterView.revertImageView(
() -> {
// No-op
});
assertFalse(flutterView.renderSurface instanceof FlutterImageView);
flutterView.detachFromFlutterEngine();
assertEquals(null, flutterView.getCurrentImageSurface());
// Invoke all registered `FlutterUiDisplayListener` callback
mockFlutterJni.onFirstFrame();
}
@Test
public void onConfigurationChanged_fizzlesWhenNullEngine() {
FlutterView flutterView = new FlutterView(Robolectric.setupActivity(Activity.class));