kotlin @Composable调用只能从@Composable函数的上下文中发生- LazyColumn

svdrlsy4  于 2023-11-21  发布在  Kotlin
关注(0)|答案(1)|浏览(465)

我试图获取联系人号码和姓名,但遇到错误,显示:
@Composable调用只能从@Composable函数的上下文中发生。
如何解决此问题?

data class Contact(val name: String, val phoneNumber: String)

@Composable
fun ContactList(){
    val context = LocalContext.current
    val launcher = rememberLauncherForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
        if (isGranted) {
            // Permission is granted, fetch the contacts
            val contacts = fetchContacts(context)
            LazyColumn {
                items(contacts) { contact ->
                    Text(text = "Name: ${contact.name}, Phone: ${contact.phoneNumber}")
                    Spacer(modifier = Modifier.padding(10.dp))
                }
            }
        } else {
            // Handle the case when the user denies the permission
        }
    }

    // Request permission to read contacts
    launcher.launch(Manifest.permission.READ_CONTACTS)
}

private fun fetchContacts(context: Context): List<Contact> {
    val contacts = mutableListOf<Contact>()
    val cursor = context.contentResolver.query(
        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
        null,
        null,
        null,
        null
    )

    cursor?.use {
        while (it.moveToNext()) {
            val name = it.getString(it.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME))
            val phoneNumber = it.getString(it.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))
            contacts.add(Contact(name, phoneNumber))
        }
    }

    return contacts
}

字符串

uyto3xhc

uyto3xhc1#

rememberLauncherForActivityResult(...)接受第二个参数onResult,这只是一个标准回调(不是可组合的)。当你试图调用一个可组合的函数时,(LazyList { ... }),其中期望的是正常的。我处理这种情况的方法是在本地或在视图模型中更改一些状态变量,当onResult触发时-然后在UI中侦听此变量的更改,然后在UI中显示惰性列表

相关问题