iT邦幫忙

2023 iThome 鐵人賽

DAY 28
0
自我挑戰組

一天學一篇 Google Codelabs系列 第 28

112/28 - 架構與狀態 - 提升狀態的位置、進階狀態和連帶效果

  • 分享至 

  • xImage
  •  

今天學什麼?

今天閱讀「適用於 Android 開發人員的 Jetpack Compose」第三章「架構與狀態」的「提升狀態的位置」、「進階狀態和連帶效果

學習筆記

提升狀態的位置

  1. 安卓開發中有兩種邏輯
    • 畫面邏輯
      • 在螢幕上顯示狀態
    • 業務邏輯
      • 資料來自何處
  2. UI logic (state):Composables、Plain state holder class
  3. Business logic (state):Screen level state holder(AAC ViewModel)
  4. 狀態不提升會降低畫面的可重複性
  5. 建議把狀態放在讀取或寫入該狀態的所有可組合項目之間

進階狀態和連帶效果

  1. collectAsStateWithLifecycle()會監聽生命週期,從 StateFlow 收集各個值,並透過 Compose 的 State API 呈現最新的值
    • 引用外掛
      dependencies {
          implementation "androidx.lifecycle:lifecycle-runtime-compose:$lifecycle_version"
      }
      
  2. 長期存在的 lambda 或物件運算式參照組合期間計算的參數或值 (處理 LaunchedEffect 時可能很常發生),使用rememberUpdatedState
    Box(modifier = modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
    
        val currentOnTimeout by rememberUpdatedState(onTimeout)
    
        LaunchedEffect(Unit) {
            delay(SplashWaitTime)
            currentOnTimeout()
        }
    
        Image(painterResource(id = R.drawable.ic_crane_drawer), contentDescription = null)
    }
    
  3. openDrawer中想要使用scaffoldState.drawerState.open()的話要使用共常式
    CraneHomeContent(
        modifier = modifier,
        onExploreItemClicked = onExploreItemClicked,
        openDrawer = {
            scope.launch {
                scaffoldState.drawerState.open()
            }
        }
    )
    
  4. 狀態持有物件,以便保留在組合中,而不必每次都新增一個
  5. 如果想要使用的 Compose State 是衍生自另一個 State 時,請使用derivedStateOf
    val showButton by remember {
        derivedStateOf {
            listState.firstVisibleItemIndex > 0
        }
    }
    

上一篇
112/27 - 架構與狀態 - Compose 狀態思維
下一篇
112/29 - 架構與狀態 - Navigation 最佳做法、Navigation
系列文
一天學一篇 Google Codelabs30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言