我有以下代码.理想情况下,我将使用onPreferenceChange: (Preferences.Key) -> Unit
来调用viewModel函数,该函数将假定泛型类型为Pferencs.Key,类型为值.但是,这会产生以下错误:One type argument expected for class Key<T>
简单的方法可能是将viewModel作为ScreenBody的参数传递,但指导方针似乎不建议这样做(子级应将事件传递给父级(S)),并 destruct Composable预览
编辑:首选项的类型.键可以是字符串、布尔值、整数、双精度、集
我怎么能在这里继续呢?
@Composable
fun SettingsScreen(
modifier: Modifier = Modifier,
viewModel: SettingsScreenViewModel = viewModel(factory = ViewModelProvider.Factory),
) {
Scaffold {
SettingsScreenBody(
onPreferenceChange = viewModel::setPreferenceValue,
modifier = Modifier.padding(innerPadding),
)
}
}
@Composable
private fun SettingsScreenBody(
onPreferenceChange: (key: Preferences.Key, value: Any) -> Unit,
modifier: Modifier = Modifier,
) {
// App Theme
ListPreference(
title = R.string.pref_title_app_theme,
) { newValue ->
onPreferenceChange(PreferenceRepository.Keys.NIGHT_MODE, newValue)
}
}
class SettingsScreenViewModel(
private val preferenceRepository: PreferenceRepository,
): ViewModel() {
val preferences = preferenceRepository.preferences
fun <T> setPreferenceValue(key: Preferences.Key<T>, value: T) {
viewModelScope.launch { preferenceRepository.set(key, value) }
}
}
object Keys {
val NIGHT_MODE: Preferences.Key<String> = stringPreferencesKey("night_mode")
val METRIC_UNITS: Preferences.Key<Boolean> = booleanPreferencesKey("metric_units")
// other keys of Int and Double types
}