[英]Creating OnCompletionListener in Compose
我是 Kotlin 和 Jetpack Compose 的新 Java/Andriod 程序員。 我正在創建一個簡單的音板應用程序,其中包含三個按鈕,按下時會播放獨特的聲音。 一切順利,但我正在努力為 Mediaplayer 實例創建 OnCompletionListener(這樣我就可以釋放資源並更改 UI 上的按鈕)
在我的按鈕 Composable 中,我創建了 Mediaplayer 的實例
`val mediaPlayer:MediaPlayer by remember {
mutableStateOf(MediaPlayer.create(context,soundID))
}`
這在 Image 可組合項的 OnClick 中非常有效:
Image (
painter = painterResource(id = (imageID)),
contentDescription = null,
contentScale = ContentScale.FillBounds,
modifier = Modifier
.size(250.dp)
.aspectRatio(16f / 9f)
.clip(RoundedCornerShape(cornerDiameter.dp))
.border(
BorderStroke(4.dp, Color.Yellow),
RoundedCornerShape(cornerDiameter.dp)
)
.clickable(
enabled = true,
onClick = {
if (isPlaying) {
println("STOPPING player")
mediaPlayer.pause()
isPlaying = false
} else {
println("starting player")
mediaPlayer.start()
isPlaying = true
}
}
)
)
當各自的音頻播放完畢后,我想調用一個例程來清理和更新 UI。 當我創建 onCompletionLIstener 時,我將 MediaPlayer 的實例發送給它:
val onCompletionListener =
MediaPlayer.OnCompletionListener(trackDone(mediaPlayer))
mediaPlayer.setOnCompletionListener(onCompletionListener)
它期望 function trackDone 為(MediaPlayer!) → Unit
,它會自動創建:
fun trackDone(mediaPlayer: MediaPlayer): (MediaPlayer) -> Unit {
if(mediaPlayer != null)
{
mediaPlayer!!.stop()
mediaPlayer!!.release()
}
}
但是,我現在收到 trackDone 的錯誤消息"A 'return' expression required in a function with a block body ('{...}')"
。 但我無法弄清楚我可以提供什么類型的回報來滿足這一點。 返回 mediaPlayer 不起作用。
任何幫助表示贊賞。 我希望我已經提供了足夠的信息。
編譯器期望trackDone
返回一個lambda
接受MediaPlayer
並且不返回任何內容。 我不確定你想用這個 function 簽名完成什么,但下面的代碼將修復編譯錯誤。
fun trackDone(mediaPlayer: MediaPlayer): (MediaPlayer) -> Unit {
if(mediaPlayer != null)
{
mediaPlayer!!.stop()
mediaPlayer!!.release()
}
return {}
}
我認為這不完全是您的意圖,而是您希望從這個 function 獲得一些callback
。
首先,請清理它,你不需要檢查可nullability
,也不需要喊!!
在您的代碼中,因為 function 已經需要一個不可為 null 的MediaPlayer
參數。
接下來,只需添加一個額外的 function 類型參數,該參數將用作trackDone
中的callback
。
將它們放在一起,您的trackDone
function 應該如下所示
fun trackDone(mediaPlayer: MediaPlayer, onComplete : (MediaPlayer) -> Unit) {
// remove unnecessary nullability checking
mediaPlayer.stop()
mediaPlayer.release()
// on complete callback
onComplete(mediaPlayer)
}
或者如果你不想返回MediaPlayer
實例那么這個,
fun trackDone(mediaPlayer: MediaPlayer, onComplete : () -> Unit) {
// remove unnecessary nullability checking
mediaPlayer.stop()
mediaPlayer.release()
// on complete callback
onComplete()
}
這就是它“理想地”使用的方式。
fun someFunction() {
val mediaPlayer: MediaPlayer
...
...
...
trackDone(mediaPlayer) { stoppedMediaPlayer ->
// DONE
}
// or
trackDone(mediaPlayer) {
// DONE
}
}
現在我不知道這是否會像您想要實現的那樣對“completeListener”回調“起作用”,但是“修復”肯定會編譯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.