Property delegate must have a 'getValue(Nothing?, KProperty*>)' method

Viewed 1811

I'm trying to set theme of my app according to what the user chooses. It can be dark theme or light theme.

I have created viewModel as:

class ThemeViewModel(application: Application) : AndroidViewModel(application) {
    private val _darkMode = MutableLiveData<Boolean>(true)
    val darkMode : LiveData<Boolean>
        get() = _darkMode


    fun setDarkMode(isDarkMode:Boolean){
        _darkMode.value = isDarkMode
    }

    fun getDarkMode():Boolean = _darkMode.value!!

}

I have created my theme as :

@Composable
fun VoodleeTheme(
    darkTheme: Boolean,
    content: @Composable () -> Unit
) {
    MaterialTheme(
        colors = if (darkTheme) DarkColors else LightColors,
        content = content
    )

}

I used setContent as :

setContent {
  MyApp {
    val doDark: Boolean by 
    themeViewModel.darkMode.observeAsState(Boolean) //this line gives error

    VoodleeTheme(darkTheme = doDark) {
    ProgressNavigation(themeViewModel)
        }
    }
}

Please help m fix this.

2 Answers

Add,

import androidx.compose.runtime.getValue

This is an extension function for MutableState<T> that implements the requirements to use by in a val.

Solved it by using:

 val doDark: State<Boolean> = themeViewModel.darkMode.observeAsState(initial = false)

In place of:

val doDark: Boolean by themeViewModel.darkMode.observeAsState(Boolean)
Related