android - Jetpack Compose 和 Compose Navigation 如何处理 Android Activity ?

标签 android kotlin android-jetpack-compose

我目前正在研究 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只是一个可组合的。我的问题是:
  • 这个可组合物的“生命周期”在这里等价的东西是什么?假设我想在加载屏幕、销毁屏幕等时执行一些操作。这可能与我有更多屏幕并在它们之间导航的情况更相关
  • 有没有办法在 Compose 和标准 Activity 之间进行整合?也就是说,为屏幕定义 Activity ,每个 Activity 都是 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/

    相关文章:

    android - 如何避免 Android 游戏中的时钟漏洞利用?

    android - 完成 "all"异步任务后更新屏幕

    android - 无法访问 'kotlin.collections.Collection',它是 'org.gradle.api.artifacts.dsl.RepositoryHandler' 的父类(super class)型

    机器人 : mutablelivedata change is not updating the UI

    java - 如何在 Kotlin 的 Java 8 流上调用 collect(Collectors.toList())?

    android - 如何减少 androidx.compose.material3.OutlinedTextField 的高度

    Android 如何在 TextView 或任何内容中打印数组

    android - 将参数传递给相机 Activity

    android - 为什么有时需要在列表中使用 key() ?

    android - 如何检测 Jetpack Compose 中是否按下了按钮?