逐句理解項目含義珠洗。
可以到項目地址查看源碼,加速Github 對照坦冠,因為完全拿代碼沒意義
- MainActivity/setContent/ProvideWindowInsets
ProvideWindowInsets
要在可組合中設置 Insets凤覆,需要調用 ProvideWindowInsets 函數(shù)并包裝您的內容。 這通常會在可組合層次結構的頂層附近完成:
該庫不會禁用窗口裝飾擬合推掸。 為了讓視圖層次結構能夠接收插圖屯换,您需要確保從Activity中調用:WindowCompat.setDecorFitsSystemWindows(window, false)。
需要將系統(tǒng)欄背景設置為透明挽牢,這可以通過我們的系統(tǒng) UI 控制器庫來完成谱煤。setContent 之前代碼中設置,官方標準
例子:
setContent {
MaterialTheme {
ProvideWindowInsets {
// your content
}
}
}
Providers
/**
* [Providers] binds values to [ProvidableCompositionLocal] keys. Reading the [CompositionLocal]
* using [CompositionLocal.current] will return the value provided in [Providers]'s [values]
* parameter for all composable functions called directly or indirectly in the [content] lambda.
*
* @sample androidx.compose.runtime.samples.compositionLocalProvider
*
* @see CompositionLocal
* @see compositionLocalOf
* @see staticCompositionLocalOf
*/
@Composable
@OptIn(InternalComposeApi::class)
fun Providers(vararg values: ProvidedValue<*>, content: @Composable () -> Unit) {
currentComposer.startProviders(values)
content()
currentComposer.endProviders()
}
[Providers] 將值綁定到 [ProvidableCompositionLocal] 鍵禽拔。
讀取 [CompositionLocal]使用 [CompositionLocal.current] 將返回 [Providers] 的 [values] 中提供的值
在 [content] lambda 中直接或間接調用的所有可組合函數(shù)的參數(shù)刘离。
理解這個我們需要去讀他的源碼看他是干什么的室叉。
ProvidedValue-----》CompositionLocal
class ProvidedValue<T> internal constructor(
val compositionLocal: CompositionLocal<T>,
val value: T,
val canOverride: Boolean
)
一個實例,用于保存 [Providers] 提供的值硫惕,并由[ProvidableCompositionLocal.provides] 中綴運算符創(chuàng)建
如果 [canOverride] 為 false
茧痕,則提供的值不會覆蓋范圍內可能已經存在的值。
具體代碼不貼上來恼除,看下CompositionLocal 源碼
Compose 將數(shù)據通過組合樹顯式地通過參數(shù)傳遞踪旷,達到可組合的功能。 這中方式是最簡單和最好的方式豁辉,讓數(shù)據流過那個樹令野。
有時,此模型可能很麻煩徽级,或者因需要大量componets 流過的數(shù)據而崩潰气破。組件,或者當組件需要在彼此之間傳遞數(shù)據但保留該實現(xiàn)時細節(jié)為私密餐抢。 對于這些情況现使,[CompositionLocal]s 可以用作獲取數(shù)據的隱式方式流過一個組合。
val openDrawerEvent = viewModel.drawerShouldBeOpened.observeAsState()
drawerShouldBeOpened 是一個MainViewModel實例
observeAsState
開始觀察這個 LiveData 并通過 State 表示它的值旷痕。 每次將新值發(fā)布到 LiveData 時朴下,返回的 State 將被更新,從而導致每個 State.value 用法的重新組合苦蒿。當這個可組合的處置或當前 LifecycleOwner 移動到Lifecycle.State.DESTROYED 狀態(tài)時,內部觀察者將自動刪除渗稍。
接下來的幾行代碼佩迟,還是比較簡單,就是操作抽屜的開關操作和狀態(tài)設置竿屹。
JetchatDrawer 抽屜自定義封裝
@Composable
fun ColumnScope.JetchatDrawer(onProfileClicked: (String) -> Unit, onChatClicked: (String) -> Unit) {
// Use statusBarsHeight() to add a spacer which pushes the drawer content
// below the status bar (y-axis)
Spacer(Modifier.statusBarsHeight())
DrawerHeader()
Divider()
DrawerItemHeader("Chats")
ChatItem("composers", true) { onChatClicked("composers") }
ChatItem("droidcon-nyc", false) { onChatClicked("droidcon-nyc") }
DrawerItemHeader("Recent Profiles")
ProfileItem("Ali Conors (you)", meProfile.photo) { onProfileClicked(meProfile.userId) }
ProfileItem("Taylor Brooks", colleagueProfile.photo) {
onProfileClicked(colleagueProfile.userId)
}
}
具體細節(jié)查看源碼