下面的设置似乎很简单(对我来说),但由于
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 类和关联的存储库和数据模型看起来不错。不是吗?
java.lang.NoSuchMethodException: com.mydummy.viewmodeltesting.DummyViewModel.<init> [].
这意味着没有可用的无参构造函数。如果不将存储库作为参数传递给视图模型,by viewModels()
似乎无法创建此视图模型实例