如何从 onClick(来自 onClickListener)或 onComplete(来自 onCompleteListener)函数中启动 JetPack Compose AlertDialog

问题描述 投票:0回答:1

我正在努力将现有的 Kotlin 应用程序转换为 Kotlin MultiPlatform 和 JetPack Compose。

作为登录活动的一部分,我登录用户并从那里直接执行逻辑。 部分登录过程使用FirebaseAuth,如下

private fun signInUser(mEmail: String?, mPassword: String?) {
        val c = Calendar.getInstance()
        val df = SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS a z")
        currentDateAndTime1 = df.format(c.time)
        Log.i(" ", "Login: signInUser started at $currentDateAndTime1")
        Log.i(" ", "Login signInUser: user= $user")
        Log.i(" ", "Login signInUser: email= $mEmail password= $mPassword")
        mAuth = FirebaseAuth.getInstance()

        mAuth!!.signInWithEmailAndPassword((mEmail)!!, (mPassword)!!)
            .addOnCompleteListener(object : OnCompleteListener<AuthResult?> {
                @OptIn(ExperimentalMaterial3Api::class)
                @Composable
                override fun onComplete(task: Task<AuthResult?>) {
                    if ((task.isSuccessful) || (user != null)) {
                    ........  additional logic 
                    ComposeAlert(onDismissRequest = {openAlertDialog.value = false },
                                onConfirmation = {
                                openAlertDialog.value = false},
                                dialogTitle = "Remove Family Administrator",
                                dialogText = "Please confirm you want to be removed as a family administrator on this device",
                                icon = Icons.Default.Info)
                    }  
                 }
              } 

在“override fun onComplete”语句中,我收到一条错误,表明

"@Composable annotation mismatch with overridden function @Optin @Composable public open fun onComplete(task: Task<AuthResult?>: Unit defined in
com.grgmobilesolutions.mycomposeapplication.android.Login.signInUser.'<no name provided>, 
public abstract fun onComplete @NonNull p() Task<AuthResult?>: Unit defined in 
com.google.android.gms.tasks.onCompleteListener" 

我在“onClick”侦听器函数上遇到相同的基本错误。

我的假设是 addOnCompleteListener 或 onComplete 方法的签名需要更改,但我找不到任何指示如何更改的信息。 addOnClickLIstener 和 onClick 方法也是如此(ComposeAlert 可组合项之外的活动可组合按钮)。

以下是“ComposeAlert”可组合项。

 @OptIn(ExperimentalMaterial3Api::class)
    @Composable
    fun ComposeAlert(
        onDismissRequest: () -> Unit,
        onConfirmation: () -> Unit,
        dialogTitle: String,
        dialogText: String,
        icon: ImageVector,
    ) {
        AlertDialog(
            icon = {
                Icon(icon, contentDescription = "Example Icon")
            },
            title = {
                Text(text = dialogTitle)
            },
            text = {
                Text(text = dialogText)
            },
            onDismissRequest = {
                onDismissRequest()
            },
            confirmButton = {
                TextButton(
                    onClick = {
                        onConfirmation()
                    }
                ) {
                    Text("OK")
                }
            },
            dismissButton = {
                TextButton(
                    onClick = {
                        onDismissRequest()
                    }
                ) {
                    Text("Cancel")
                }
            }
        )
    }
firebase android-jetpack-compose kotlin-multiplatform
1个回答
0
投票

您收到以下错误:

@Composable 注解与重写函数 @Optin @Composable public open fun onComplete(task: Task: Unit

因为您将

@Composable
注释添加到一个函数,该函数会覆盖不是
Composable
函数的函数。 onComplete(Task task) 函数是存在于 OnCompleteListener 接口中的常规函数。你看,没有
@Composable
注释吗?

我在“onClick”侦听器函数上遇到相同的基本错误。

这与上面的完全一样。 onClick(v: View!) 函数是存在于 View.OnClickListener 接口中的常规函数。这不是

Composable
函数。

因此您无法在上述任何函数前面添加

@Composable
注释。

我的假设是 addOnCompleteListener 或 onComplete 方法的签名需要更改。

您无法更改

onComplete
onClick
的声明。

如果您想在使用电子邮件和密码登录用户的操作完成后调用可组合函数,那么您必须定义一个

MutableState
变量:

var composeAlert by remember { mutableStateOf(false) }

然后在回调中,您必须将值更改为

true

mAuth!!.signInWithEmailAndPassword(mEmail!!, mPassword!!).addOnCompleteListener(object : OnCompleteListener<AuthResult?> {
        override fun onComplete(task: Task<AuthResult?>) {
            if ((task.isSuccessful) || (user != null)) {
                composeAlert = true
            }
        }
    }

然后仅当

ComposeAlert
的值为 true 时才显示
composeAlert
可组合项的内容:

if(composeAlert) {
    ComposeAlert(/* ... */)
}
© www.soinside.com 2019 - 2024. All rights reserved.