[Component]合成データの保持


Componentでは、データの状態が変化するとsetContentが呼び出されます.これを「再結合」と呼び、データを単独で格納しない場合、再結合時にデータが初期化されます.
💡 Component用語説明
  • コンポーネント:JetPack ComponentがComponentを実行するときに構築するUIについての説明
  • 初期構成:初回構成作成を実行する
  • リカバリ(再構成):
  • Composableを再実行し、データ変更時に構成を更新
    Componentでは、コマンドベースのビューとは異なり、データが変更された場合は、ステータスを明示的に通知する必要があります.
    ex)TextFieldでonValue Changeを定義すると、入力した文字がビューに表示されます.
    この文書では、Corposeでデータが変更され、再結合されたときにデータを維持する方法について説明します.
    1)rememberの使用
    setContent{
    		val data =remember{mutableStateOf("Hello")}
    		Column(
            modifier = Modifier.fillMaxSize(),
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally
        ){
    				Text(text = data.value,
                		fontSize = 30.sp)
    				Button(onClick ={
    						data.value = "world"
    				}){
    					Text("변경")
    				}
        }
    
    }
    MutableStateOfは、観測不可能なMutableStateを作成し、実行時にComposeに統合できる観測不可能なタイプです.
    💡 interface MutableState<T> : State<T> {
        override var value: T
    }
    
    Componentosableは観測可能なので.
    valueを観察すると、valueが変化すると検出され、リカバリが保持されます.
    MutableStateがrememberコンビネーションとして宣言された場合、変数は初期コンビネーションにメモリに格納され、コンビネーションの復元時に値が返されます.また、値を変更して、再構成するたびに値を保存することもできます.
    ただし、画面が回転するとActivityが再起動するため、再描画するとrememberはその値を保持しません.このときrememberSaveableを使用できます.
    2)既存のViewModelを使用する
    💡 ViewModelとは?Androidアーキテクチャコンポーネント(AAC)は、UI関連データを格納および管理するために使用されます.
  • アクティビティはライフサイクルと同じなのでrememberを使わずにデータを保持できます.
  • UIはコントローラから分離され、注目点を分離することでコードのメンテナンスが容易になります.
  • 計画間のデータ共有はより容易になる.
  • class MainActivity : ComponentActivity() {
        private val viewModel byviewModels<MainViewModel>()
    		...
    		setContent {
                Column(
                    ...
                ){
                    Text(text = viewModel.data.value,
                        fontSize = 30.sp)
                    Button(onClick = {
                        viewModel.data.value = "world"
                    }) {
                        Text("변경")
                    }
                }
    
            }
    class MainViewModel : ViewModel(){
        private val data = mutableStateOf("Hello")
    }
    3)Component ViewModelの使用
    今回はComponent提供のViewModelを使用します.setContentで使用できます.
    上記の2番目のオプションでは、ViewModelを使用してデータを維持できますが、ViewModelメンバー変数を操作する問題が発生します.
    したがって、このデータをプライベートとして宣言し、Getterのように使用できるようにComposeで追跡できるステータスデータを作成できます.
    また、changeValueというメソッドを作成することで、ビューは値の内部動作を変更することを理解すべきでない注目点の分離を満たします.
    class MainActivity : ComponentActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    				setContent{
    				val viewModel =viewModel<MainViewModel>()
    				Column(
                    ...
                ){
    						Text(text = viewModel.data.value,
                        fontSize = 30.sp)
    						Button(onClick ={
    								viewModel.changeValue()
    						}){
    								Text("변경")
    						}
            }
    		}
    }
    class MainViewModel : ViewModel(){
        private val _data =mutableStateOf("Hello")
        val data : State<String> = _data
        fun changeValue(){
            _data.value = "world"
        }
    }
    [出典]https://growup-lee.tistory.com/entry/Android-Compose-State-役人
    https://www.charlezz.com/?p=45464