mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Fix Native Rotation Android (#18872)
Summary: Fixes #14161 Android crashes in some cases if an animated transform config contains a string value, like a rotation. This PR fixes that by ensuring all values sent to the native side are doubles. It adds `__transformDataType` to AnimatedTransform.js. Added integration test `ReactAndroid/src/androidText/js/AnimatedTransformTestModule.js` This test fails with the following error `INSTRUMENTATION_RESULT: longMsg=java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Double`, if the changes to AnimatedTransform.js are reverted. [Android] [Fixed] - Fixes Android crash on animated style with string rotation Pull Request resolved: https://github.com/facebook/react-native/pull/18872 Differential Revision: D13894676 Pulled By: cpojer fbshipit-source-id: 297e8132563460802e53f3ac551c3ba9ed943736
This commit is contained in:
committed by
Facebook Github Bot
parent
02697291ff
commit
e405e84fc3
@@ -0,0 +1,81 @@
|
||||
/**
|
||||
* Copyright (c) 2013-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @providesModule AnimatedTransformTestModule
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var BatchedBridge = require('BatchedBridge');
|
||||
var React = require('React');
|
||||
var StyleSheet = require('StyleSheet');
|
||||
var View = require('View');
|
||||
var TouchableOpacity = require('TouchableOpacity');
|
||||
var Text = require('Text');
|
||||
var RecordingModule = require('NativeModules').Recording;
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
base: {
|
||||
width: 200,
|
||||
height: 200,
|
||||
backgroundColor: 'red',
|
||||
transform: [{rotate: '0deg'}],
|
||||
},
|
||||
transformed: {
|
||||
transform: [{rotate: '45deg'}],
|
||||
},
|
||||
});
|
||||
|
||||
/**
|
||||
* This app presents a TouchableOpacity which was the simplest way to
|
||||
* demonstrate this issue. Tapping the TouchableOpacity causes an animated
|
||||
* transform to be created for the rotation property. Since the property isn't
|
||||
* animated itself, it comes through as a static property, but static properties
|
||||
* can't currently handle strings which causes a string->double cast exception.
|
||||
*/
|
||||
class AnimatedTransformTestApp extends React.Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.toggle = this.toggle.bind(this);
|
||||
}
|
||||
|
||||
state = {
|
||||
flag: false,
|
||||
};
|
||||
|
||||
toggle() {
|
||||
this.setState({
|
||||
flag: !this.state.flag,
|
||||
});
|
||||
}
|
||||
|
||||
render() {
|
||||
// Using this to verify if its fixed.
|
||||
RecordingModule.record('render');
|
||||
|
||||
return (
|
||||
<View style={StyleSheet.absoluteFill}>
|
||||
<TouchableOpacity
|
||||
onPress={this.toggle}
|
||||
testID="TouchableOpacity"
|
||||
style={[styles.base, this.state.flag ? styles.transformed : null]}>
|
||||
<Text>TouchableOpacity</Text>
|
||||
</TouchableOpacity>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
var AnimatedTransformTestModule = {
|
||||
AnimatedTransformTestApp: AnimatedTransformTestApp,
|
||||
};
|
||||
|
||||
BatchedBridge.registerCallableModule(
|
||||
'AnimatedTransformTestModule',
|
||||
AnimatedTransformTestModule
|
||||
);
|
||||
|
||||
module.exports = AnimatedTransformTestModule;
|
||||
Reference in New Issue
Block a user