Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
React native setState change在更改对象属性时不可靠_React Native_Video_Expo_State - Fatal编程技术网

React native setState change在更改对象属性时不可靠

React native setState change在更改对象属性时不可靠,react-native,video,expo,state,React Native,Video,Expo,State,我试图在视频暂停时显示自定义播放按钮。当直接单击播放按钮时(预期行为),播放按钮消失并重新出现,但当我使用视频的“本机控件”时,播放按钮消失并重新出现,尽管相应状态变量的值确实发生了变化。我做错了什么 import React,{Component}来自'React'; 从“react native”导入{视图、TouchableOpacity、样式表、文本}; 从“expo保持清醒”导入{activateKeepAwake,deactivateKeepAwake}; 从“react nativ

我试图在视频暂停时显示自定义播放按钮。当直接单击播放按钮时(预期行为),播放按钮消失并重新出现,但当我使用视频的“本机控件”时,播放按钮消失并重新出现,尽管相应状态变量的值确实发生了变化。我做错了什么

import React,{Component}来自'React';
从“react native”导入{视图、TouchableOpacity、样式表、文本};
从“expo保持清醒”导入{activateKeepAwake,deactivateKeepAwake};
从“react native”导入{AsyncStorage};
从“expo av”导入{音频、视频};
从“@expo/vector icons”导入{Ionicons};
导出类VideoControl扩展React.Component{
建造师(道具){
超级(道具);
this.playButton=React.createRef();
控制台日志(“道具道具”);
this.video=null;
此.state={
“视频播放”:没错,
“不透明度”:1,
“playbackObject”:空
}
}
_handleVideoRef=组件=>{
这个视频=组件;
}
_播放状态=播放状态=>{
//console.log(播放状态[“isplay”]);
if(playStatus.isPlaying==true&&this.state.vidPlaying==false){
console.log(“正在播放”);
activateKeepAwake();
this.setState({“vidPlaying”:true});
console.log(this.state.vidPlaying);
}
else if(playStatus.isPlaying==false&&this.state.vidPlaying==true){
控制台日志(“暂停”);
去激活keepawake();
this.setState({“vidPlaying”:false});
console.log(this.state.vidPlaying);
}
//console.log(this.state.vidPlaying);
}
播放视频=异步()=>{
如果(this.video!==null){
var stat=wait this.video.getStatusAsync();
如果(stat.isPlaying==true){
控制台日志(“播放”)
this.video.pauseAsync();
}
否则{
console.log(“不播放”)
如果(stat.positionMillis==stat.playableDurationMillis){
this.video.replayAsync();
}
否则{
this.video.playsync();
}
}
}
返回true;
}
render(){
返回(
Terst{this.state.vidPlaying?1:0}
)
}
}

_playState处理程序中的console.log会按预期打印正确的vidPlaying值(尽管有时会快速切换)。同时,即使在预期的行为中,视频播放传递给TouchableHighlight的价值实际上与应该发生的相反。当我的测试文本显示0时,按钮可见,反之亦然。当状态更改时,文本会更改,无论是从touchablehighlight单击还是从NativeControl播放,但touchablehighlight并不总是如此。

状态更改是异步的。要真正检查值是否已正确更改,请将控制台日志作为回调传递
this.setState({..},()=>console.log(this.state.vidPlaying))
,这可能解释了快速更改,但它始终稳定在文本和console.log中的预期值?组件刷新是否只有一次调用?