簡體   English   中英

在 Compose 中創建 OnCompletionListener

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM