RN: Workaround for ReactNativeART on Android

Summary:
Brings back the fix for `overflow: hidden` on Android by implementing a workaround for a bug with `ReactNativeART`.

The ReactNativeART bug is that changes in the canvas due to a resize of the `Surface` are not properly reflected on Android. I have verified that the correct props are being computed and passed to the shadow nodes and that the `ARTSurfaceView`'s canvas is indeed updated. But for some reason, the paint is not updated.

This workaround is to simply unmount and remount `Surface` on Android. It sucks and we should eventually fix it.

Reviewed By: achen1

Differential Revision: D8818010

fbshipit-source-id: 71d1927580b6bde7263fd241797d4655140b5f34
This commit is contained in:
Tim Yung 2018-07-12 07:58:40 -07:00 committed by Facebook Github Bot
parent b5f027dd77
commit d756d94b3a
2 changed files with 9 additions and 6 deletions

View File

@ -11,6 +11,7 @@
const Color = require('art/core/color');
const Path = require('ARTSerializablePath');
const Platform = require('Platform');
const Transform = require('art/core/transform');
const React = require('React');
@ -150,11 +151,14 @@ class Surface extends React.Component {
}
render() {
const props = this.props;
const w = extractNumber(props.width, 0);
const h = extractNumber(props.height, 0);
const height = extractNumber(this.props.height, 0);
const width = extractNumber(this.props.width, 0);
// WORKAROUND: Android bug in which canvas does not reflect size changes.
const key = Platform.OS === 'android' ? height + ',' + width : null;
return (
<NativeSurfaceView style={[props.style, {width: w, height: h}]}>
<NativeSurfaceView key={key} style={[this.props.style, {height, width}]}>
{this.props.children}
</NativeSurfaceView>
);

View File

@ -51,9 +51,8 @@ public class ReactViewGroup extends ViewGroup implements
/**
* Kill switch to make overflow hidden by default. This flag will eventually be removed.
* TODO (T31096050): Sets this back to `false` until ReactNativeARTSurface issue is resolved.
*/
public static boolean sDefaultOverflowHidden = true;
public static boolean sDefaultOverflowHidden;
private static final int ARRAY_CAPACITY_INCREMENT = 12;
private static final int DEFAULT_BACKGROUND_COLOR = Color.TRANSPARENT;