philipy355 / inflearn-compose

0 stars 0 forks source link

docs : Compose에서 Livedata 사용방법 & State가 읽기만 가능한 이유 (#3) #14

Open philipy355 opened 8 months ago

philipy355 commented 8 months ago
class MainViewModel: ViewModel(){
    /**
       * @Stable
      interface MutableState<T> : State<T> {
      override var value: T
      operator fun component1(): T  ==> getter
      operator fun component2(): (T) -> Unit  ==> setter
      }
     */
    private val _value : MutableState<String> = mutableStateOf("Hello World")
    //State:읽기만 가능
    val value : State<String> = _value

    private val _liveData = MutableLiveData<String>()
    val liveData: LiveData<String> = _liveData

    fun changeValue(value: String){
        _value.value = value
    }
}

class MainActivity : ComponentActivity() {
    @OptIn(ExperimentalMaterial3Api::class, ExperimentalComposeUiApi::class)
    @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter",
        "UnusedMaterialScaffoldPaddingParameter"
    )
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            HomeScreen()
        }
    }
}

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun HomeScreen(viewModel: MainViewModel = viewModel()){
    val text1 : MutableState<String> = remember {
        mutableStateOf("Hello World")
    }

    var text2 : String by remember {
        mutableStateOf("Hello World")
    }

    val (text : String, setText: (String) -> Unit) = remember {
        mutableStateOf("Hello World")
    }

    //observeAsState를 통해 Compose에서 liveData 사용 할 수 있다.
    //kotlin flow도 Compose에서 제공해준다.
    val text3 = viewModel.liveData.observeAsState("Hello World")

    Column() {
        Text("Hello World")
        Button(onClick = {
            text1.value = "변경"
            println(text1.value)
            text2 = "변경"
            println(text2)
            setText("변경")
            viewModel.changeValue("변경")
//            println(text)
        }){
            Text("클릭")
        }
        //recomposition ==> 다시 그려지는 행위..
        TextField(value = text, onValueChange = setText)
    }
}
philipy355 commented 8 months ago
//LiveData
implementation 'androidx.compose.runtime:runtime-livedata:1.5.0'