Вопрос или проблема
Я использую Jetpack Compose в Kotlin, и я столкнулся с интересной странной проблемой при работе с TextField. Согласно документации, я должен заполнить только два параметра: value
и onValueChange
. Но мой компилятор продолжает предупреждать меня с тем же сообщением: Ни одна из следующих функций не может быть вызвана с предоставленными аргументами
.
Ниже приведена часть моего кода, где мой компилятор предупреждает меня, вместе с импортами:
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.camera.core.CameraSelector
import androidx.camera.core.Preview
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.camera.view.PreviewView
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.*
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.*
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import androidx.compose.ui.window.Dialog
import androidx.core.content.ContextCompat
if(showDialog){
Dialog(onDismissRequest = {showDialog = false}){
var inputText:String by remember{ mutableStateOf("")}
Column(modifier = Modifier.fillMaxSize().padding(16.dp)){
TextField(
value = inputText,
onValueChange = { it:String -> inputText = it},
label = {Text("Возраст")},
colors = TextFieldDefaults.colors(),
){}
Button(onClick = {
if (inputText.isNotEmpty()) {
dataList.add(inputText)
showDialog = false
}
}){
Text("Отправить")
}
}
}
}
Существовал аналогичный вопрос, который был задан в 2021 году. Но тот вопрос касался делегированных свойств. Однако мой редактор (Intellij Idea) точно распознавал типы моих параметров, в то время как предполагал, что мне не хватает каких-то других параметров.
Позже я выяснил, что он заставил меня заполнить colors
, но затем показал красный )
, что я не могу понять. Я не могу добавить картинку, поэтому я выделил символы, которые должны быть красными, как жирные:
Ни одна из следующих функций не может быть вызвана с предоставленными аргументами.
- TextField(TextFieldValue, (TextFieldValue) → Unit, Modifier = …, Boolean = …, Boolean = …, TextStyle = …, (() → Unit)? = …, (() → Unit)? = …, (() → Unit)? = …, (() → Unit)? = …, (() → Unit)? = …, (() → Unit)? = …, (() → Unit)? = …, Boolean = …, VisualTransformation = …, KeyboardOptions = …, KeyboardActions = …, Boolean = …, Int = …, Int = …, MutableInteractionSource = …, Shape = …, TextFieldColors = …) определено в androidx.compose.material3
- TextField(String, (String) → Unit, Modifier = …, Boolean = …, Boolean = …, TextStyle = …, (() → Unit)? = …, (() → Unit)? = …, (() → Unit)? = …, (() → Unit)? = …, (() → Unit)? = …, (() → Unit)? = …, (() → Unit)? = …, Boolean = …, VisualTransformation = …, KeyboardOptions = …, KeyboardActions = …, Boolean = …, Int = …, Int = …, MutableInteractionSource = …, Shape = …, TextFieldColors = …) определено в androidx.compose.material
Существуют ли определенные способы решения аналогичных проблем?
if(showDialog){
Dialog(onDismissRequest = {showDialog = false}){
var inputText:String by remember{ mutableStateOf("")}
Column(modifier = Modifier.fillMaxSize().padding(16.dp)){
TextField(
value = inputText,
onValueChange = {inputText = it},
label = {Text("Возраст")},
colors = TextFieldDefaults.colors()
)
Button(onClick = {
if (inputText.isNotEmpty()) {
dataList.add(inputText)
showDialog = false
}
}){
Text("Отправить")
}
}
}
}
исправил ваш код, вся проблема заключалась в {}
после вашего TextField, текстовое поле не знало, какой аргумент вы пытаетесь передать, и поэтому оно подчеркивало всю конструкцию
Ответ или решение
Проблема, с которой вы столкнулись в вашем коде на Kotlin с использованием Jetpack Compose, связана с тем, что вы добавили пустые фигурные скобки {}
после вызова функции TextField
. Этот синтаксис вызывает путаницу у компилятора, так как он воспринимает это как попытку передать аргумент в функцию, но не знает, что именно вы хотите передать.
Решение проблемы
Вот, что вам следует изменить в вашем коде:
if(showDialog) {
Dialog(onDismissRequest = { showDialog = false }) {
var inputText: String by remember { mutableStateOf("") }
Column(modifier = Modifier.fillMaxSize().padding(16.dp)) {
TextField(
value = inputText,
onValueChange = { inputText = it }, // Убедитесь, что тут никаких фигурных скобок
label = { Text("Age") },
colors = TextFieldDefaults.colors() // Или другой дефолтный цвет или стиль
) // Удалите здесь фигурные скобки
Button(onClick = {
if (inputText.isNotEmpty()) {
dataList.add(inputText)
showDialog = false
}
}) {
Text("Submit")
}
}
}
}
Уточнение ошибки
Когда вы вызываете TextField
, вы должны передать все необходимые параметры, и если вы добавляете {}
, это интерпретируется как блок кода, что неправильно для функции TextField
. Функция не ожидает дополнительных аргументов или тела (как в случае с Composable
функцией), поэтому компилятор не может обработать это и выдает ошибку.
Возможные дополнительные советы
-
Проверка зависимости: Убедитесь, что вы используете правильные версии библиотек Jetpack Compose. Иногда различия в версиях могут вызывать подобные ошибки.
-
Обновление IDE: Иногда среда разработки может иметь баги или недопонимание, попробуйте обновить ваш IntelliJ IDEA или Android Studio до последней версии.
-
Изучение документации: Всегда полезно проверить официальную документацию Jetpack Compose, чтобы убедиться, что вы используете функции правильно и в соответствии с последними изменениями в API.
Заключение
Проблема "None of the following functions can be called with the arguments supplied" часто возникает из-за неверного синтаксиса или передачи аргументов. В вашем конкретном случае это было вызвано использованием дополнительных фигурных скобок. Убедившись, что вы передаете правильные аргументы без лишних структур, вы избежите подобных ошибок в будущем.