react-native-video-player播放完报flexGrow NaN的Invariant Violation修复
报错根因
这个错误是样式值为NaN时直接传递给原生层触发的合法性校验拦截,触发时机和endWithThumbnail属性强绑定:react-native-video-player在视频播放完成、从播放器视图切换到缩略图静态视图的过程中,内部逻辑没有对计算得到的容器样式做空值兜底,将未成功计算的flexGrow值(类型为NaN)直接传递给底层RCTView组件,最终触发原生层报错。
具体修正方案
- 给FlatList两列布局下的外层卡片View补上明确的固定宽度,不要完全依赖流式布局的自适应计算。原实现的卡片View仅设置了margin属性,没有明确宽度,会导致组件在切换视图时拿不到准确的父容器尺寸,进而计算出错误的flexGrow值。
- 给VideoPlayer组件显式传入
containerStyle属性,将flexGrow固定设置为合法数字值(比如0),覆盖组件内部的默认空样式逻辑,从根源上避免传递NaN值到原生层。 - 如果业务不需要播放结束显示缩略图的能力,可暂时移除
endWithThumbnail属性,临时规避组件内部的视图切换bug。 - 调整原有代码的标签嵌套结构,原代码中VideoPlayer的闭合标签位置错位,会导致组件props解析异常,也会间接引发样式计算空值的问题。
修正后的参考代码
<FlatList numColumns={2} data={this.state.studio} renderItem={({item}) => ( // 外层卡片View补充固定宽度,避免尺寸计算空值 <View style={{marginTop:10, marginLeft:10, width: Dimensions.get('window').width / 2 - 15}}> {item.IsAudio == 1 ? ( <View> <Text>hii</Text> </View> ) : ( <View> <VideoPlayer endWithThumbnail video={{uri: `${IMAGE}${item.MediaLink}`}} videoWidth={200} videoHeight={150} resizeMode={'stretch'} // 显式固定容器样式,避免flexGrow被计算为NaN containerStyle={{flexGrow: 0}} /> </View> )} </View> )} />
内容的提问来源于stack exchange,提问作者Andruroshan
相关产品推荐
相关产品推荐

