admin管理员组

文章数量:1220063

TextField always get empty when I try to write in it.

My ViewModel:

class MyVM: ViewModel() {
    var name by mutableStateOf("")

    fun onNameChange(newString: String) {
        name = newString
    }
}

In MainActivity:

val myVM = MyVM()

MyScreen(
    modifier = Modifier.fillMaxSize(),
    name = myVM.name
) {
    myVM.onNameChange(it)
}

MyScreen:

@Composable
fun MyScreen(
    modifier: Modifier,
    name: String,
    onNameChange: (String) -> Unit,
) {
    Box(
        modifier = modifier,
        contentAlignment = Alignment.Center,
    ) {
        OutlinedTextField(
            value = name,
            onValueChange = { newText -> onNameChange(newText) },
            label = { Text(text = "Name") },
            modifier = Modifier
                .fillMaxWidth()
                .padding(8.dp),
        )
    }
}

I want user to enter their name and in viewmodel update the name mutable state variable

TextField always get empty when I try to write in it.

My ViewModel:

class MyVM: ViewModel() {
    var name by mutableStateOf("")

    fun onNameChange(newString: String) {
        name = newString
    }
}

In MainActivity:

val myVM = MyVM()

MyScreen(
    modifier = Modifier.fillMaxSize(),
    name = myVM.name
) {
    myVM.onNameChange(it)
}

MyScreen:

@Composable
fun MyScreen(
    modifier: Modifier,
    name: String,
    onNameChange: (String) -> Unit,
) {
    Box(
        modifier = modifier,
        contentAlignment = Alignment.Center,
    ) {
        OutlinedTextField(
            value = name,
            onValueChange = { newText -> onNameChange(newText) },
            label = { Text(text = "Name") },
            modifier = Modifier
                .fillMaxWidth()
                .padding(8.dp),
        )
    }
}

I want user to enter their name and in viewmodel update the name mutable state variable

Share Improve this question edited Feb 7 at 10:30 tyg 15.2k4 gold badges35 silver badges48 bronze badges asked Feb 7 at 10:16 Ajay JaiswarAjay Jaiswar 92 bronze badges New contributor Ajay Jaiswar is a new contributor to this site. Take care in asking for clarification, commenting, and answering. Check out our Code of Conduct.
Add a comment  | 

1 Answer 1

Reset to default 3

Using val myVM = MyVM() in Compose will create a new view model instance on each recomposition, starting with a new name property that is empty.

You want the view model instance to survive recompositions. For that you need to use the factory function viewModel() like this:

val myVM = viewModel<MyVM>()

or

val myVM: MyVM = viewModel()

Take your pick.

本文标签: androidTextField39s onValueChange doesn39t modify view model stateStack Overflow