我目前正在研究某人的旧代码,我有点困惑。如何使用下面的代码来填充惰性列?每个lazyColumn 项目都应显示标题和说明。任何帮助深表感谢。惰性列当前不显示任何内容(
featureConfigs = listOf<Feature>()
未填充),但我不太确定我哪里出了问题。
ViewModel 类:
class FeatureConfigViewModel @Inject constructor(
private val featuresRepository: FeaturesRepository,
private val localFeatureConfigOverrider: LocalFeatureConfigOverrider): ViewModel() {
var featureConfigs = listOf<Feature>()
@Inject lateinit var featureConfig: FeatureConfig
init {
if (
JSON_FEATURE_FLAG_DATA_KEY.isNotEmpty()
) {
val jsonData = JSON_FEATURE_FLAG_DATA_KEY
loadFeatures(jsonData)
} else {
loadFeatures()
}
}
fun loadFeatures() {
loadFeatures(featuresRepository.getFeatures(JSON_FILE_NAME))
}
fun loadFeatures(jsonData: String) {
loadFeatures(
featuresRepository.getFeatures(JSON_FILE_NAME)
.zipWith(
featuresRepository.getFeaturesFromJson(jsonData)
) { featuresFromFile, featuresFromJson ->
for (feature in featuresFromFile) {
val overrideValue = featuresFromJson[feature.key]
if (overrideValue != null) {
localFeatureConfigOverrider.put(feature.key, overrideValue)
}
}
featuresFromFile
}
)
}
private fun loadFeatures(featuresSingle: Single<List<Feature>>) {
val d = featuresSingle.subscribe({ featureList ->
val features = featureList.toMutableList().sortedBy { it.key }
featureConfigs = features
}) { throwable ->
Logger.e(throwable)
}
}
companion object {
private const val JSON_FILE_NAME = "fileName.json"
const val JSON_FEATURE_FLAG_DATA_KEY = "keyName"
}
}
使用lazyColumn查看片段(我希望使用包含ViewModel结果的列表来填充lazy列):
LazyColumn(modifier = Modifier
.weight(weight = 1f, fill = false)
.fillMaxSize()) {
items(items = configs) {
LazyColumnDescription(
name = it.key,
description = it.description,
)
}
}
Compose 只能观察已包装在 State 类中的数据。 你应该更改此代码:
var featureConfigs = listOf<Feature>()
对此:
val featureConfigs = MutableStateFlow((listOf<Feature>()))
那么你应该通过下面的代码观察这个值:
val configList by featureConfigs.collectAsState()
然后你的 UI 可以识别你的更改。
我不知道您所有的
loadFeatures
重载在做什么,但一般来说,如果您想从可组合项中的 ViewModel 观察列表,您可以使用 mutableStateOf()
将列表存储在 ViewModel 中。
我假设您有一些名为
Feature
: 的数据类
data class Feature(
val key: Int, val description: String
)
然后,在您的 ViewModel 中,您可以使用如下所示的内容。我建议使用一些值初始化
featureConfigs
列表,以查看这些值是否显示在 LazyColumn 中。然后您可以进一步追踪错误是否来自featuresRepository
。
class FeatureConfigViewModel @Inject constructor(
private val featuresRepository: FeaturesRepository,
private val localFeatureConfigOverrider: LocalFeatureConfigOverrider
): ViewModel() {
var featureConfigs by mutableStateOf<List<Feature>>(
listOf(Feature(1, "A"), Feature(2, "B"), Feature(3, "C"))
)
fun loadFeatures() {
featureConfigs = featuresRepository.getFeatures()
}
}
在您的可组合项中,您可以按如下方式访问它:
@Composable
MyComposable(featuresVM: FeatureConfigViewModel = viewModel()) {
Button(onClick = { featuresVM.loadFeatures() }) {
Text(text = "LOAD FEATURES")
}
LazyColumn(
modifier = Modifier
.weight(weight = 1f, fill = false)
.fillMaxSize()
) {
items(items = featuresVM.featureConfigs) {
//...
}
}
}