带有 React Native 视频的自定义 Play/Pause 按钮 - 获取 JSON 值错误消息

Custom Play/Pause Button with React Native Video - Getting JSON Value Error Message

我正在尝试在按下整个视频时实现 play/pause。

const RenderItem = (props) => {
  const [paused, setPaused] = useState(true);
  return (
    <View>
      {props.is_video ? (
        <>
          <Video
            paused={paused}
            resizeMode="contain"
            source={{
              uri: props.mediaUrl,
            }}
          />
          <TouchableWithoutFeedback onPress={setPaused}>
            <Text>Play Darnit!</Text>
          </TouchableWithoutFeedback>
        </>
      ) : (
        <Image
          resizeMode="contain"
          source={{uri: props.mediaUrl}}
        />
      )}
    </View>
  );
};

好像是按下文字导致视频播放(我能听到声音),然后很快就收到错误消息:

JSON value '{
    "_dispatchInstances" = "<null>";
    "_dispatchListeners" = "<null>";
    "_targetInst" = "<null>";
    bubbles = "<null>";
    cancelable = "<null>";
    defaultPrevented = "<null>";
    dispatchConfig = "<null>";
    eventPhase = "<null>";
    isTrusted = "<null>";
    nativeEvent = "<null>";
    target = "<null>";
    type = "<null>";
}' of type NSMutableDictionary cannot be converted to BOOL

另外,顺便提一下,这个 RenderItem 是在一个包含多个视频的 FlatList 中呈现的。我不确定是否还必须将按钮与正确的视频相匹配?所以播放按钮不会意外播放另一个视频,或一次播放所有视频。

为什么会出现此错误?

您的 onPress 只是在调用 setPaused,但您并没有告诉它要将其设置为什么。所以目前它只是从水龙头中获取本地事件。然后礼貌地告诉你,所说的原生事件不是布尔值。

所以如果我是你,我会创建一个名为 togglePaused 的函数来切换你的状态,然后在 onPress 中调用它,比如...

const RenderItem = (props) => {
  const [paused, setPaused] = useState(true);

  const togglePaused = () => setPaused(prev => !prev) // add this toggle function

  return (
    <View>
      {props.is_video ? (
        <>
          <Video
            paused={paused}
            resizeMode="contain"
            source={{
              uri: props.mediaUrl,
            }}
            />
            {/* call togglePaused in the onPress prop  */}
          <TouchableWithoutFeedback onPress={togglePaused}>
            <Text>Play Darnit!</Text>
          </TouchableWithoutFeedback>
        </>
      ) : (
        <Image
          resizeMode="contain"
          source={{uri: props.mediaUrl}}
        />
      )}
    </View>
  );
};