You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native TrackPlayer播放状态类型不匹配报错求助

解决react-native-track-player播放状态类型不匹配问题

问题根源

usePlaybackState 返回的不是直接的 State 枚举值,而是一个结构为 { state: State | undefined } 的对象(组件初始加载时,state 可能为 undefined)。你直接将这个对象当作 State 类型使用,导致了类型不兼容错误。

修复步骤

1. 正确提取播放状态值

从 usePlaybackState 返回的对象中取出实际的 state 属性,单独处理:

const playbackStateObj = usePlaybackState();
const currentState = playbackStateObj.state;

2. 调整函数参数类型与逻辑

修改 togglePlayback 函数,适配 State | undefined 类型的参数,并增加空值判断:

const togglePlayback = async (playback?: State) => {
  const currentTrack = await TrackPlayer.getActiveTrack();
  // 同时校验当前曲目存在且播放状态有效
  if (currentTrack !== null && playback) {
    if (playback === State.Paused || playback === State.Ready) {
      await TrackPlayer.play();
    } else {
      await TrackPlayer.pause();
    }
  }
};

3. 修正组件调用逻辑

在调用 togglePlayback 和判断图标时,使用提取出的 currentState 而非原对象:

<Pressable onPress={() => togglePlayback(currentState)}>
  <Icon
    style={[styles.icon, styles.playButton]}
    name={currentState === State.Playing ? "pause" : "play"}
    size={75}
  />
</Pressable>

完整修复后代码

import React, { useState } from 'react'
import { View, StyleSheet, Pressable} from 'react-native'
import TrackPlayer, { State , usePlaybackState } from 'react-native-track-player';
import Icon from 'react-native-vector-icons/FontAwesome';

const ControlCenter = () => {
  // 提取实际的播放状态值
  const playbackStateObj = usePlaybackState();
  const currentState = playbackStateObj.state;

  const skipToNext = async () => {
    await TrackPlayer.skipToNext()
  }
  const skipToPrevious = async () => {
    await TrackPlayer.skipToPrevious()
  }

  const togglePlayback = async (playback?: State) => {
    const currentTrack = await TrackPlayer.getActiveTrack();
    if (currentTrack !== null && playback) {
      if (playback === State.Paused || playback === State.Ready) {
        await TrackPlayer.play()
      } else {
        await TrackPlayer.pause();
      }
    }
  };

  const [bgColor, setBgColor] = useState("#ff0000")
  
  return (
    <View style={[styles.container, { backgroundColor: `${bgColor}` }]}>
      <Pressable onPress={skipToPrevious}>
        <Icon style={styles.icon} name="step-backward" size={40} />
      </Pressable>
      <Pressable onPress={() => togglePlayback(currentState)}>
        <Icon
          style={[styles.icon, styles.playButton]}
          name={currentState === State.Playing ? "pause" : "play"}
          size={75}
        />
      </Pressable>
      <Pressable onPress={skipToNext}>
        <Icon style={styles.icon} name="step-forward" size={40} color="#900" />
      </Pressable>
    </View>
  )
}

内容的提问来源于stack exchange,提问作者Kuldeep Tiwari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 16:01:28