如何使用 Single<List<Type>> 的结果来填充惰性列? Kotlin、Jetpack Compose

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

我目前正在研究某人的旧代码,我有点困惑。如何使用下面的代码来填充惰性列?每个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,
                    )
                }
            }
android kotlin android-jetpack-compose
2个回答
0
投票

Compose 只能观察已包装在 State 类中的数据。 你应该更改此代码:

var featureConfigs = listOf<Feature>()

对此:

val featureConfigs = MutableStateFlow((listOf<Feature>()))

那么你应该通过下面的代码观察这个值:

val configList by featureConfigs.collectAsState()

然后你的 UI 可以识别你的更改。


0
投票

我不知道您所有的

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) {
            //...
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.