Jetpack Compose 设置中直接 ViewModel 的 NoSuchMethodException

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

下面的设置似乎很简单(对我来说),但由于

FATAL EXCEPTION: main
而失败,并出现
java.lang.NoSuchMethodException: com.mydummy.viewmodeltesting.DummyViewModel.<init> []

这很有趣。

init()
方法就在那里。我还在 Android Studio 中使用全新的
EmptyActivity
项目对此进行了测试,该项目具有以下设置。

MainActivity.kt

class MainActivity : ComponentActivity() {
    val viewModel: DummyViewModel by viewModels()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            ViewModelTestingTheme {
                val data by viewModel.dataState.collectAsState()
                Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) {
                    ShowDataList(dataList = data)
                }
            }
        }
    }
}

@Composable
fun ShowDataList(dataList: List<DummyMetadata>, modifier: Modifier = Modifier) {
    Box(modifier = Modifier.fillMaxSize()) {
        LazyColumn(modifier = Modifier) {
            items(dataList) { data -> ShowDataItem(model = data)}
        }
    }
}

@Composable
fun ShowDataItem(model: DummyMetadata) {
    Card(shape = RoundedCornerShape(8.dp), modifier = Modifier) {
        Text(text = model.title)
    }
}

DummyViewModel.kt

class DummyViewModel(private val _repository: DummyRepository): ViewModel() {
    private val _dataState = MutableStateFlow<List<DummyMetadata>>(emptyList())
    val dataState: StateFlow<List<DummyMetadata>> = _dataState

    init {
        fetchData()
    }

    private fun fetchData() {
        viewModelScope.launch {
            try {
                val data = _repository.collectDummyData()
                _dataState.value = data
            } catch (e: Exception) {
                // TODO Error handling or at least better logging
                e.printStackTrace()
            }
        }
    }
}

DummyRepository.kt

class DummyRepository {
    suspend fun collectDummyData(): List<DummyMetadata> {
        return listOf(
            DummyMetadata("First dummy"),
            DummyMetadata("Second dummy"),
            DummyMetadata("Last dummy")
        )
    }
}

DummyMetadata.kt中的数据类是:

data class DummyMetadata(
    val title: String
)

仅此而已。 ViewModel 类和关联的存储库和数据模型看起来不错。不是吗?

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

java.lang.NoSuchMethodException: com.mydummy.viewmodeltesting.DummyViewModel.<init> [].
这意味着没有可用的无参构造函数。如果不将存储库作为参数传递给视图模型,
by viewModels()
似乎无法创建此视图模型实例

© www.soinside.com 2019 - 2024. All rights reserved.