在Jetpack Compose中创建MediaPlayer的OnCompletionListener遇问题求助
解决MediaPlayer OnCompletionListener的返回值错误问题
你写的trackDone函数声明要返回(MediaPlayer) -> Unit类型(也就是一个接收MediaPlayer参数的函数),但函数体里根本没返回符合要求的内容,这就是报错的原因。
给你两种解决办法:
方案一:直接用Lambda简化实现
没必要单独写trackDone函数,设置监听器时直接传Lambda就行,这也是Kotlin里最常用的写法:
mediaPlayer.setOnCompletionListener { mp -> mp.stop() mp.release() // 别忘了更新UI,比如把播放状态切回false isPlaying = false }
方案二:修正trackDone函数的返回值
如果一定要保留这个函数,得让它返回一个符合要求的函数类型,改成这样:
fun trackDone(): (MediaPlayer) -> Unit { return { mp -> mp.stop() mp.release() // 这里加UI更新逻辑 } } // 使用的时候 val onCompletionListener = MediaPlayer.OnCompletionListener(trackDone()) mediaPlayer.setOnCompletionListener(onCompletionListener)
或者更简洁的函数表达式写法:
fun trackDone() = { mp: MediaPlayer -> mp.stop() mp.release() // UI更新逻辑 }
另外提两个关键注意点:
isPlaying必须用mutableStateOf声明,不然状态变化不会触发Compose的UI重组:var isPlaying by remember { mutableStateOf(false) }- 要注意MediaPlayer的资源泄漏问题,建议用
DisposableEffect在Composable销毁时释放资源:DisposableEffect(Unit) { onDispose { if (mediaPlayer.isPlaying) { mediaPlayer.stop() } mediaPlayer.release() } }
内容的提问来源于stack exchange,提问作者AndyMo
相关产品推荐
相关产品推荐

