

介绍
一个简单并提供高度扩展功能的 Compose 导航组件,同时支持 Android 和 Desktop 平台。
常用功能

使用
下载
implementation("io.github.succlz123:compose-screen-android:0.0.2")
implementation("io.github.succlz123:compose-screen-desktop:0.0.2")
开始
Android
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
ScreenContainer() {
}
ScreenContainer(, , , ) {
}
}
}
}
Desktop
fun main() = application {
val size = DpSize(480.dp, 720.dp)
val windowState = rememberWindowState(size = size)
ScreenContainer(
title = "Compose Screen",
state = windowState,
onCloseRequest = {
exitApplication()
},
) {
}
}
通用
Screen Host
val screenNavigator = rememberScreenNavigator()
ScreenHost(screenNavigator = screenNavigator, rootScreenName = "your root screen") {
groupScreen(screenName = ("your root screen")) {
XXXScreen()
}
groupScreen(screenName = "your YYY screen") {
YYYScreen()
}
itemScreen(screenName = "your popup screen") {
ZZZPopupScreen()
}
...
}
导航
val screenNavigator = LocalScreenNavigator.current
screenNavigator.push(screenName = )
count =
screenNavigator.push(
screenName = ,
arguments = ScreenArgs.putValue(, count)
)
screenNavigator.push(
screenName = ,
pushOptions = PushOptions().apply {
removePredicate = PushOptions.SingleTopPredicate()
}
)
screenNavigator.push(
screenName = ,
pushOptions = PushOptions().apply {
removePredicate = PushOptions.SingleTaskPredicate()
}
)
screenNavigator.push(
screenName = ,
pushOptions = PushOptions().apply {
removePredicate = PushOptions.PopItselfPredicate()
}
)
screenNavigator.remove(screenName = )
返回
screenNavigator.pop()
返回到某一页面
screenNavigator.popTo(screenName = "ZZZScreen")
返回并获得结果
val onResult = LocalScreenRecord.current.result
返回拦截
screenNavigator.pop(popOptions = PopOptions(popStackFinalInterceptor = { backstackList, _, _ ->
backstackList.size > 10
}))
浮窗
弹窗

PopupScreen 层级高于 Screen,附属于当前绑定的 Group Screen。退出 Group Screen 时,PopupScreen 同时消失。
ScreenHost(screenNavigator = screenNavigator, rootScreenName = Manifest.MainScreen) {
popup(screenName = Manifest.DialogPopupScreen) {
DialogPopupScreen(screenNavigator)
}
}
screenNavigator.push(Manifest.DialogPopupScreen)
吐司

全局只有一个吐司,吐司永远在所有页面层级之上,切换页面不会导致吐司消失。
screenNavigator.toast("Your toast.")
screenNavigator.toast(
arguments = ScreenArgs.putValue(KEY_TOAST_TIME, ARGS_TOAST_TIME_SHORT)
.putValue(KEY_TOAST_TIME_LOCATION, ARGS_TOAST_TIME_LOCATION_BOTTOM_CENTER)
.putValue(KEY_TOAST_MSG, "Your toast."))
screenNavigator.toast {
BoxWithConstraints(modifier = Modifier.fillMaxSize()) {
...
}
}
浮动窗口

同一个 Group Screen 中只能存在一个 PopupWindow。退出 Screen PopupWindow 同时消失。
Column(modifier = Modifier.fillMaxSize().background(Color.White)) {
...
PopupWindowLayout(displayContent = {
...
}, clickableContent = {
...
})
...
}
生命周期
针对 Compose 为了更好的处理在某些特殊场景下的需要,ScreenLifecycleCallback 提供了 screenLifecycleState 和 hostLifecycleState 生命周期回调。
hostLifecycleState
宿主 Android/Desktop 生命周期回调
Android 下目前 Compose 收不到 onCreate onDestroy 相应回调
screenLifecycleState
Screen 抽象后的生命周期,通常来讲业务逻辑不应该依赖与此,切换页面会导致在此触发的 OnCreate 和 OnResume。
ScreenLifecycleCallback(screenRecord, screenLifecycleState = {
println("Screen lifecycle - $countValue: ${it.name}")
if (it == ComposeLifecycle.State.DESTROYED) {
screenNavigator.toast("Screen lifecycle - $countValue: is destroyed")
}
}, hostLifecycleState = {
println(">>> Host lifecycle: ${getPlatformName()} - ${it.name} <<<")
})
视图模块
针对不同场景下的 ViewModel 使用, Compose Screen 提供了 viewModel,sharedViewModel,globalViewModel,androidViewModel 的扩展方法来方便使用。
Compose ViewModel
val viewModel = viewModel { YourViewModel() }
@Composable
fun XXXScreen(){
val sharedViewModel = sharedViewModel { YourViewModel() }
}
@Composable
fun YYYScreen(){
val sharedViewModel = sharedViewModel { YourViewModel() }
}
val globalViewModel = globalViewModel { YourViewModel() }
Android ViewModel
val androidViewModel = androidViewModel { YourAndroidViewModel() }
动画
转场动画
框架内已经封装了几个常见转场动画,如下是右边进左边出的转场动画
screenNavigator.push(
"your screen",
pushOptions = PushOptions(
pushTransition = ScreenTransitionRightInLeftOutPush(),
popTransition = ScreenTransitionRightInLeftOutPop()
)
)
响应系统返回
Android
在 Compose Screen 初始化时,传入 OnBackPressedDispatcherOwner, 就可以响应系统返回按键。
Desktop
可以通过 enableEscBack 来开启关闭 Compose Screen 响应 ESC 按键返回
横竖屏 UI 适配
val windowSizeOwner = LocalScreenWindowSizeOwner.current
val windowWidth = remember {
windowSizeOwner.getWindowHolder().size.value.width.toInt()
}
val windowHeight = remember {
windowSizeOwner.getWindowHolder().size.value.height.toInt()
}
val windowSizeClass = remember {
windowSizeOwner.getWindowHolder().sizeClass.value
}
when (windowSizeClass) {
ScreenWindowSizeClass.Compact -> {}
ScreenWindowSizeClass.Medium -> {}
ScreenWindowSizeClass.Expanded -> {}
}
Android 异常状态恢复
目前已自动处理了 Android 横竖屏切换或者配置变化下导致的异常状态恢复
感谢