如何修复错误消息:“类型不匹配”推断类型为 MutableState<List<Task>> 但需要 Int”

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

第一次使用 ViewModel,所以有点迷失。我已经像这样定义了我的视图模型:

data class Task(
    val id: String,
    val title: String,
    val description: String,
    val isCompleted: Boolean
)

class TaskViewModel : ViewModel() {
    // A list to hold our tasks
    var taskList = mutableStateOf(
        listOf(
            Task("First", "Complete homework", "Finish math and science assignments", false),
            Task("Second", "Go for a run", "Run for 30 minutes in the park", false),
            Task("Third", "Read a book", "Start reading 'The Adventures of Sherlock Holmes'", false)
            // Add more tasks as needed
        )
    )

然后尝试在惰性列中调用它,以便它显示我的 ViewModel 中的所有项目,但错误“类型不匹配”推断类型是 MutableState 但需要 Int”

fun OverviewScreen(
    navController: NavHostController,
    viewModel : TaskViewModel = viewModel()
) {
//    val viewModel = TaskViewModel.viewModel
    val viewModel: TaskViewModel = viewModel()

            LazyColumn {
            items(viewModel.taskList) { task ->
                // Display each task in your list
                Text("Task: ${task}")
            }
        }

不知道如何解决它,有什么想法吗?

android kotlin mvvm android-jetpack-compose android-viewmodel
1个回答
0
投票

因此,

items
中的
LazyColumn
可以接受 Int (重复可组合项的次数)或项目列表(为列表中的每个项目重复可组合项),但是您传递的是MutableState
items
不知道如何从中获取数据,这里有多种解决方案:

解决方案 1. 使用

.value
将从 MutableState 中获取列表

items(viewModel1.taskList.value) { task ->
    // Display each task in your list
    Text("Task: ${task}")
}

解决方案 2. 在视图模型中使用

by
允许所有引用获取值而不是 mutableState

import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel

data class Task(
    val id: String,
    val title: String,
    val description: String,
    val isCompleted: Boolean
)

class TaskViewModel : ViewModel() {
    // A list to hold our tasks
    var taskList by mutableStateOf(
        listOf(
            Task("First", "Complete homework", "Finish math and science assignments", false),
            Task("Second", "Go for a run", "Run for 30 minutes in the park", false),
            Task("Third", "Read a book", "Start reading 'The Adventures of Sherlock Holmes'", false)
            // Add more tasks as needed
        )
    )
}
LazyColumn {
   items(viewModel1.taskList) { task ->
       // Display each task in your list
       Text("Task: ${task}")
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.