JetPack Compose 實(shí)戰(zhàn) Jetchat(4)

我們繼續(xù)官方Jetchat這個(gè)項(xiàng)目講解

MainActivity 的入口最后一部分代碼

 JetchatScaffold(
                        scaffoldState,
                        onChatClicked = {
                            findNavController(R.id.nav_host_fragment)
                                .popBackStack(R.id.nav_home, true)
                            scaffoldState.drawerState.close()
                        },
                        onProfileClicked = {
                            val bundle = bundleOf("userId" to it)
                            findNavController(R.id.nav_host_fragment).navigate(
                                R.id.nav_profile,
                                bundle
                            )
                            scaffoldState.drawerState.close()
                        }
                    ) {
                        // Workaround for https://issuetracker.google.com/178174718
                        // and https://issuetracker.google.com/179181757

                        // Inflate the XML layout using View Binding:
                        val bindingRef = remember { Ref<ViewBinding>() }
                        val currentView = LocalView.current

                        AndroidViewBinding({ inflater, parent, attachToParent ->
                            if (bindingRef.value == null) {
                                val binding: ViewBinding =
                                    ContentMainBinding.inflate(inflater, parent, attachToParent)
                                bindingRef.value = binding
                                binding.root.compositionContext =
                                    currentView.findViewTreeCompositionContext()
                            }
                            bindingRef.value as ViewBinding
                        })
                        // End of workaround

                        // AndroidViewBinding(ContentMainBinding::inflate)
                    }

JetchatScaffold
封裝了自己的腳手架或者頁(yè)面主題和布局

@Composable
fun JetchatScaffold(
    scaffoldState: ScaffoldState = rememberScaffoldState(),
    onProfileClicked: (String) -> Unit,
    onChatClicked: (String) -> Unit,
    content: @Composable (PaddingValues) -> Unit
) {
    JetchatTheme {
        Scaffold(
            scaffoldState = scaffoldState,
            drawerContent = {
                JetchatDrawer(
                    onProfileClicked = onProfileClicked,
                    onChatClicked = onChatClicked
                )
            },
            bodyContent = content
        )
    }
}

利用組合思想內(nèi)部封裝了JetchatTheme 自定義主題

@Composable
fun JetchatTheme(
    isDarkTheme: Boolean = isSystemInDarkTheme(),
    colors: Colors? = null,
    content: @Composable () -> Unit
) {
    val myColors = colors ?: if (isDarkTheme) JetchatDarkPalette else JetchatLightPalette

    MaterialTheme(
        colors = myColors,
        content = content,
        typography = JetchatTypography,
        shapes = JetchatShapes
    )
}

我們看到這里就要回顧主題相關(guān)知識(shí)呐萌。isDarkTheme 判斷是否是深色主題篮迎,那么MaterialDesign方式封裝了兩套主題料滥。深色和淺色

JetchatDarkPalette 和 JetchatLightPalette

private val JetchatDarkPalette = darkColors(
    primary = Blue200,
    primaryVariant = Blue400,
    onPrimary = Color.Black,
    secondary = Yellow400,
    onSecondary = Color.Black,
    onSurface = Color.White,
    onBackground = Color.White,
    error = Red300,
    onError = Color.Black
)

private val JetchatLightPalette = lightColors(
    primary = Blue500,
    primaryVariant = Blue800,
    onPrimary = Color.White,
    secondary = Yellow700,
    secondaryVariant = Yellow800,
    onSecondary = Color.Black,
    onSurface = Color.Black,
    onBackground = Color.Black,
    error = Red800,
    onError = Color.White
)

使用看來很簡(jiǎn)單瞭空,特別想C++里面的結(jié)構(gòu)提模软,其實(shí)就是兩個(gè)全局變量

封裝自己的字體等樣式排版躺涝,val JetchatTypography---Typography

特別接近CSS 有這個(gè)感覺沒厨钻,好像高級(jí)CSS也是面向?qū)ο螅救藢?duì)網(wǎng)頁(yè)不是很熟坚嗜。

學(xué)習(xí)到定義形狀夯膀,三個(gè)Shapes

val JetchatShapes = Shapes(
    small = RoundedCornerShape(50),
    medium = RoundedCornerShape(8.dp),
    large = RoundedCornerShape(0.dp)
)

看似有電生疏,我們沒有做東西而已苍蔬。

系統(tǒng)MaterialTheme 定義好了參數(shù)诱建,我們自定義傳入就好

接下來,我們要到過來银室,向上層看涂佃。

JetchatTheme 組合傳入的就是JetchatDrawer 上篇文章提到過励翼。

jetpack_jetdrawer.png

封裝的就是這個(gè)布局和點(diǎn)擊事件 onProfileClicked,onChatClicked

  1. 粗略的看 Spacer 定義了layout布局傳入Modifier

  2. 類似Android傳統(tǒng)辜荠,定義Header DawerHeader()---組合Row兩個(gè)Image

  3. 運(yùn)行項(xiàng)目會(huì)看到一個(gè)分割線 Divider(),

  4. DrawerItemHeader 定義標(biāo)題頭 Chats

  5. 接下來定義兩個(gè)ChatItem汽抚,包括點(diǎn)擊事件,就不看封裝源碼伯病。

  6. DrawerItemHeader 標(biāo)題頭

  7. 接下來定義兩個(gè)ProfileItem 組合控件造烁。

繼續(xù)向上層回溯看。

JetchatScoffold里面 定義跳轉(zhuǎn)用的Navigation午笛,NavController

內(nèi)容惭蟋,用View Binding結(jié)合inflate出XML布局

                        // Inflate the XML layout using View Binding:
                        val bindingRef = remember { Ref<ViewBinding>() }
                        val currentView = LocalView.current

                        AndroidViewBinding({ inflater, parent, attachToParent ->
                            if (bindingRef.value == null) {
                                val binding: ViewBinding =
                                    ContentMainBinding.inflate(inflater, parent, attachToParent)
                                bindingRef.value = binding
                                binding.root.compositionContext =
                                    currentView.findViewTreeCompositionContext()
                            }
                            bindingRef.value as ViewBinding
                        })

我們注意到remember 記錄值用的,可以理解緩存药磺。
還有很多地方告组,看的不是很清晰,整體來看癌佩,大致整個(gè)小項(xiàng)目木缝,還是很簡(jiǎn)單。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載围辙,如需轉(zhuǎn)載請(qǐng)通過簡(jiǎn)信或評(píng)論聯(lián)系作者我碟。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市姚建,隨后出現(xiàn)的幾起案子矫俺,更是在濱河造成了極大的恐慌,老刑警劉巖掸冤,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厘托,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡贩虾,警方通過查閱死者的電腦和手機(jī)催烘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缎罢,“玉大人伊群,你說我怎么就攤上這事〗⑹迹” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵丸卷,是天一觀的道長(zhǎng)询刹。 經(jīng)常有香客問我谜嫉,道長(zhǎng)萎坷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任哆档,我火速辦了婚禮住闯,結(jié)果婚禮上瓜浸,老公的妹妹穿的比我還像新娘。我一直安慰自己比原,他們只是感情好插佛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著雇寇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谢床。 梳的紋絲不亂的頭發(fā)上厘线,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天出革,我揣著相機(jī)與錄音,去河邊找鬼骂束。 笑死,一個(gè)胖子當(dāng)著我的面吹牛展箱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播攀隔,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼栖榨,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了婴栽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤映皆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后捅彻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡添怔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年贤旷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艾杏。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盅藻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出氏淑,到底是詐尸還是另有隱情,我是刑警寧澤假残,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站阳惹,受9級(jí)特大地震影響眶俩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜颠印,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望荒勇。 院中可真熱鬧,春花似錦沽翔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)窗轩。三九已至座咆,卻和暖如春痢艺,著一層夾襖步出監(jiān)牢的瞬間介陶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工舌缤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留某残,地道東北人国撵。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓介牙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親耻瑟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赏酥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 逐句理解項(xiàng)目含義谆构。 可以到項(xiàng)目地址查看源碼,加速Github[https://gitee.com/zcwfeng/...
    zcwfeng閱讀 1,995評(píng)論 0 10
  • Jetpack Compose 是一個(gè)獨(dú)立的 UI 工具包搬素,它結(jié)合了響應(yīng)式編程模型和 Kotlin 編程語(yǔ)言的簡(jiǎn)潔...
    zhangke3016閱讀 7,619評(píng)論 6 16
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭熬尺,有人歡樂有人憂愁,有人驚喜有人失落粱哼,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,536評(píng)論 28 53
  • 信任包括信任自己和信任他人 很多時(shí)候,很多事情胯舷,失敗、遺憾桑嘶、錯(cuò)過,源于不自信逃顶,不信任他人 覺得自己做不成,別人做不...
    吳氵晃閱讀 6,190評(píng)論 4 8
  • 步驟:發(fā)微博01-導(dǎo)航欄內(nèi)容 -> 發(fā)微博02-自定義TextView -> 發(fā)微博03-完善TextView和...
    dibadalu閱讀 3,138評(píng)論 1 3