2

在使用 FlatList 滑动时,我可以控制台记录可查看的项目,但我想知道如何管理暂停视频。或者如果有更好的方法这样做?

这是 RenderItem 函数组件

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

  const togglePlay = () => setPaused(prev => !prev);

  return (
    <View>
      {props.is_video ? (
        <>
          <Video
            paused={paused}
            repeat
            source={{uri: props.mediaUrl}}
          />
          <TouchableWithoutFeedback onPress={togglePlay}>
            <View>
                {paused ? <Icon
                size={180}
                name="play"
                type="FontAwesome"
                style={{opacity: 0.7, color: '#cccccc'}}
              /> : null}
            </View>
          </TouchableWithoutFeedback>
        </>
      ) : (
        <Image source={{uri: props.mediaUrl}} />
      )}
    </View>
  );
};

然后在另一个函数中,我有这个:

const Post = (props) => {

  const onViewRef = useRef((viewableItems)=> {console.log(viewableItems)});
  const viewConfigRef = useRef({ viewAreaCoveragePercentThreshold: 50 });

  return (
    <View style={{flex: 1}}>
      <View>
        <FlatList
          onViewableItemsChanged={onViewRef.current}
          viewabilityConfig={viewConfigRef.current}
          data={props.navigation.state.params.media}
          snapToAlignment={'center'}
          horizontal
          decelerationRate={'fast'}
          pagingEnabled
          renderItem={({item}) => <RenderItem {...item} />}
          keyExtractor={item => item.mediaUrl}
        />
      </View>
    </View>
  );
};

我可以按下视频,它会播放或暂停。当我现在滑动时,视频会继续播放。我希望能够确保在滑动时,播放的视频现在会暂停。

4

1 回答 1

2

您可以将暂停/播放状态提升到父组件 ( Post)。由于在任何时候最多应该播放 1 个视频,因此状态可以简单地存储mediaUrl当前正在播放的项目 ID(或者如果您使用它作为密钥/ID)。

RenderItem

<Video paused={props.paused} ... />
<TouchableWithoutFeedback onPress={props.onTogglePlay}>

Post(您可以useCallback用于匿名函数):

const [activeVideo, setActiveVideo] = useState(null);
...
<FlatList onViewableItemsChanged={() => setActiveVideo(null)} .../>
...
<RenderItem 
  paused={activeVideo !== item.mediaUrl} 
  onTogglePlay={() =>
    setActiveVideo(item.mediaUrl === activeVideo ? null : item.mediaUrl)
  }
  {...item}
/>

您还可以将参考存储到活动视频并通过该参考暂停视频。

于 2020-01-19T01:35:38.963 回答