本机动画模块不支持样式 属性 'width':重写我的代码需要建议
Style property 'width' is not supported by native animated module: need advice for rewriting my code
我继承了以下组件,它与以前版本的 react-native 配合得很好,在其他组件显示的按钮上显示不透明的滚动进度条。
最近升级到react-native 0.62.2时出现请求添加useNativeDriver
的错误。添加它并将其设置为 'yes' 时,出现错误提示“style property 'width' is not supported by native animated module
”。
将 useNativeDriver
设置为 false 时,我没有收到错误消息,但动画不工作(至少在 android 上没有。未在 iOS 上测试) .
关于如何修改代码以使其与最新版本的 react-native 一起工作的任何建议?
import React, { Component } from 'react';
import { Animated, Easing } from 'react-native';
import { connect } from 'react-redux';
class ProgressBar_Module extends Component {
constructor(props) {
super(props);
this.state = {
progress: 0
}
this.d_isMounted = false;
this.d_initialTime = 0;
this.d_animation_width = new Animated.Value(1);
this.d_animation_progressTime = 3000;
}
componentDidMount() {
this.d_initialTime = Date.now();
this.d_isMounted = true;
this.progressCount();
}
componentDidUpdate(prevProps) {
if(prevProps.timerStart < this.props.timerStart) {
this.setState({
animation_width: new Animated.Value(1),
animation_progressTime: 3000
});
this.progressCount(true)
}
}
componentWillUnmount() {
this.d_isMounted = false;
}
progressCount = (reset) => {
if( reset ) {
this.d_animation_width = new Animated.Value(1);
this.d_animation_progressTime = 3000;
}
Animated.timing(this.d_animation_width, {
toValue: 175,
duration: this.d_animation_progressTime,
easing: Easing.linear
}).start(() => {
if(this.props.timer && this.d_animation_width.__getValue() === 175) {
this.props.onPress();
}
})
}
render() {
return (
<Animated.View
style={[
{
position: 'absolute',
left: 0,
height: '150%',
width: 0,
zIndex: 1,
backgroundColor: 'black',
},
{ width: this.props.timer !== false ?
this.d_animation_width : 175 }
]}
onPress={this.props.onPress}
>
</Animated.View>
)
}
}
const mapStateToProps = state => {
return {
timer: state.get('ui').get('timer').get('timer'),
reset: state.get('ui').get('resetTimer').get('resetTimer'),
timerStart: state.get('ui').get('resetTimer').get('timerStart')
}
};
export const ProgressBar = connect(mapStateToProps)(ProgressBar_Module);
尝试使用 transform 和 scaleX,而不是设置宽度动画。
以下是对本机转换做出反应的一些参考:
https://reactnative.dev/docs/transforms
按照@YaNuSH 的建议,我只需要更换
width: animatedValue
与:
transform: [{ scaleX: scaling }],
完整详情:
之前:
Animated.timing(this.d_animation_width, {
toValue: 175,
duration: this.d_animation_progressTime,
easing: Easing.linear
}).start(()
之后:
Animated.timing(this.d_animation_width, {
toValue: 175,
duration: this.d_animation_progressTime,
easing: Easing.linear,
useNativeDriver: true
}).start(()
之前:
return (
<Animated.View
style={[{
position: 'absolute',
left: 0,
height: '150%',
width: 0,
zIndex: 1,
backgroundColor: 'black',
},
{
width: this.props.timer !== false ?
this.d_animation_width : 175
}]}
onPress={this.props.onPress}
>
</Animated.View>
)
之后:
const scaling = this.props.timer !== false ? this.d_animation_width : 175;
return (
<Animated.View
style={[
{
position: 'absolute',
left: 0,
height: '150%',
width: 2,
zIndex: 1,
backgroundColor: 'black',
},
{
transform: [
{
scaleX: scaling
},
],
},
]}
onPress={this.props.onPress}
>
</Animated.View>
)
尝试这样做。
useNativeDriver: false
对我有用。
我继承了以下组件,它与以前版本的 react-native 配合得很好,在其他组件显示的按钮上显示不透明的滚动进度条。
最近升级到react-native 0.62.2时出现请求添加useNativeDriver
的错误。添加它并将其设置为 'yes' 时,出现错误提示“style property 'width' is not supported by native animated module
”。
将 useNativeDriver
设置为 false 时,我没有收到错误消息,但动画不工作(至少在 android 上没有。未在 iOS 上测试) .
关于如何修改代码以使其与最新版本的 react-native 一起工作的任何建议?
import React, { Component } from 'react';
import { Animated, Easing } from 'react-native';
import { connect } from 'react-redux';
class ProgressBar_Module extends Component {
constructor(props) {
super(props);
this.state = {
progress: 0
}
this.d_isMounted = false;
this.d_initialTime = 0;
this.d_animation_width = new Animated.Value(1);
this.d_animation_progressTime = 3000;
}
componentDidMount() {
this.d_initialTime = Date.now();
this.d_isMounted = true;
this.progressCount();
}
componentDidUpdate(prevProps) {
if(prevProps.timerStart < this.props.timerStart) {
this.setState({
animation_width: new Animated.Value(1),
animation_progressTime: 3000
});
this.progressCount(true)
}
}
componentWillUnmount() {
this.d_isMounted = false;
}
progressCount = (reset) => {
if( reset ) {
this.d_animation_width = new Animated.Value(1);
this.d_animation_progressTime = 3000;
}
Animated.timing(this.d_animation_width, {
toValue: 175,
duration: this.d_animation_progressTime,
easing: Easing.linear
}).start(() => {
if(this.props.timer && this.d_animation_width.__getValue() === 175) {
this.props.onPress();
}
})
}
render() {
return (
<Animated.View
style={[
{
position: 'absolute',
left: 0,
height: '150%',
width: 0,
zIndex: 1,
backgroundColor: 'black',
},
{ width: this.props.timer !== false ?
this.d_animation_width : 175 }
]}
onPress={this.props.onPress}
>
</Animated.View>
)
}
}
const mapStateToProps = state => {
return {
timer: state.get('ui').get('timer').get('timer'),
reset: state.get('ui').get('resetTimer').get('resetTimer'),
timerStart: state.get('ui').get('resetTimer').get('timerStart')
}
};
export const ProgressBar = connect(mapStateToProps)(ProgressBar_Module);
尝试使用 transform 和 scaleX,而不是设置宽度动画。 以下是对本机转换做出反应的一些参考: https://reactnative.dev/docs/transforms
按照@YaNuSH 的建议,我只需要更换
width: animatedValue
与:
transform: [{ scaleX: scaling }],
完整详情:
之前:
Animated.timing(this.d_animation_width, {
toValue: 175,
duration: this.d_animation_progressTime,
easing: Easing.linear
}).start(()
之后:
Animated.timing(this.d_animation_width, {
toValue: 175,
duration: this.d_animation_progressTime,
easing: Easing.linear,
useNativeDriver: true
}).start(()
之前:
return (
<Animated.View
style={[{
position: 'absolute',
left: 0,
height: '150%',
width: 0,
zIndex: 1,
backgroundColor: 'black',
},
{
width: this.props.timer !== false ?
this.d_animation_width : 175
}]}
onPress={this.props.onPress}
>
</Animated.View>
)
之后:
const scaling = this.props.timer !== false ? this.d_animation_width : 175;
return (
<Animated.View
style={[
{
position: 'absolute',
left: 0,
height: '150%',
width: 2,
zIndex: 1,
backgroundColor: 'black',
},
{
transform: [
{
scaleX: scaling
},
],
},
]}
onPress={this.props.onPress}
>
</Animated.View>
)
尝试这样做。
useNativeDriver: false
对我有用。