我目前正在研究 Jetpack Compose,试图使用现代 Android 架构组件构建功能丰富的应用程序。传统上,我的应用程序中的每个屏幕(或导航单元)要么是一个 Activity ,要么是一个 fragment ,每个都有自己的生命周期绑定(bind),但使用 Jetpack Compose 和 Compose Navigation 库,我会做这样的事情:MainActivity.kt
:
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
val navController = rememberNavController()
NavHost(navController = navController, startDestination = "main") {
composable("main") { MainScreen(navController) }
// More composable calls
}
}
}
}
在哪里 MainScreen
只是一个可组合的。我的问题是:ComponentActivity
并定义自己的可组合布局?这是出于某种原因而气馁吗? 最佳答案
Compose 应用程序设计用于没有 fragment 的单 Activity 架构。
您仍然可以拥有多个 Activity 或 fragment 并使用 setContent
在他们每个人中,但在这种情况下, Activity 之间的数据传输落在您的肩上。如果您要将新的 Compose 屏幕添加到以旧方式构建的现有应用程序,请使用此方法。
但是使用 Compose,使用 Compose Navigation 在单个 Activity 中完成所有导航要容易得多。更少的代码,由于没有不必要的代码层,更好的性能,易于传输数据等。
要使用 View 生命周期,请查看 compose side-effects :
LaunchedEffect
可用于在 View 出现时执行操作。它还运行在绑定(bind)到当前可组合的协程上下文上:您可以轻松地运行挂起函数,并且当 View 从 View 层次结构中消失时 - 协程将被取消。 DisposableEffect
可用于订阅/取消订阅回调。 当您旋转屏幕时,无论您通过哪个键,所有效果都会重新启动。
@Composable
fun MainScreen(navController: NavController) {
LaunchedEffect(Unit) {
println("LaunchedEffect: entered main")
var i = 0
// Just an example of coroutines usage
// don't use this way to track screen disappearance
// DisposableEffect is better for this
try {
while (true) {
delay(1000)
println("LaunchedEffect: ${i++} sec passed")
}
} catch (cancel: CancellationException) {
println("LaunchedEffect: job cancelled")
}
}
DisposableEffect(Unit) {
println("DisposableEffect: entered main")
onDispose {
println("DisposableEffect: exited main")
}
}
}
另请注意,在这两种情况下,以及在撰写的许多其他情况下,您都会传递 key
到这些功能。这有助于组合理解何时应该重新计算值。在我的示例中是 Unit
,这意味着在 View 消失之前它不会改变。但是如果你创建一个 remember
值,使用 View 模型中的另一个动态值,或者将另一个参数传递给可组合,您可以将其作为 key
传递,这将取消当前的 LaunchedEffect
工作和电话onDispose
对于 DisposableEffect
,您的作业将使用更新后的 key
重新开始值(value)。您可以传递任意数量的 key 。在 documentation 中阅读有关 Compose 状态的更多信息.
关于android - Jetpack Compose 和 Compose Navigation 如何处理 Android Activity ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68962458/