JetPack Compose 实战 Jetchat(2)
继续看配置app/build.gradle
buildFeatures {
compose true
viewBinding true
// Disable unused AGP features
buildConfig false
aidl false
renderScript false
resValues false
shaders false
}
指的注意的是这里开启和关闭功能的做法
承接上篇
import com.example.compose.jetchat.buildsrc.Libs
和我们平时写的gradle差不多,只不过Libs脚本化了变量而已。
开始看代码
Jetchat 地址:
入口类NavActivity
- 委托,声明MainViewModel
private val viewModel: MainViewModel by viewModels()
看代码就是打开关闭抽屉的动作
- onCreate
关闭装饰装修系统窗口,它允许我们处理插图
WindowCompat.setDecorFitsSystemWindows(window, false)
setContent
设置主界面,布局,类似我们 setContentView
ProvideWindowInsets(consumeWindowInsets = false)
为我们的内容提供 WindowInsets。 我们不想消耗它们,所以它们一直向下传递视图层次结构(因为我们使用片段)。
Providers(LocalBackPressedDispatcher provides this.onBackPressedDispatcher)
提供者将值绑定到 ProvidableCompositionLocal 键。 使用 CompositionLocal.current 读取 CompositionLocal 将返回 Providers 的 values 参数中为内容 lambda 中直接或间接调用的所有可组合函数提供的值。
主界面使用了Navigation,做导航用。
用ViewBinding做了视图的绑定
@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
)
}
}
自定义了组件JetchatDrawer,组合使用,并定义了主题JetchatTheme
val myColors = colors ?: if (isDarkTheme) JetchatDarkPalette else JetchatLightPalette
定义了两套主题色
JetchatDrawer
定义了抽屉内容和点击事件