Jetpack Compose 中的 Backpress 会重置前一屏幕的状态

问题描述 投票:0回答:1

我目前正在将旧的 Android 应用程序(基于 xml 视图)迁移到 Jetpack Compose。我对所有可组合项(视图)使用单个 Activity。我使用 NavController 进行导航。有一点不太明白:

在经典的 xml 视图中,例如,当您在特定屏幕上的文本字段中滚动或输入内容时,打开一个新的 Activity,然后按后退按钮,前一个屏幕上的滚动位置和文本输入仍然可见。在 Compose 中,按下后退按钮时屏幕会重置到起始位置。对于某些屏幕来说这不是问题,但对于其他屏幕来说则是问题。有人可以帮助我如何在 Compose 中解决这个问题吗?

android kotlin android-jetpack-compose
1个回答
0
投票

在撰写中,一旦我们在屏幕上导航,它们就会被放入堆栈中。如果按后退按钮,我们将返回到上一屏幕并保持先前的状态,init 方法将不会触发。当您使用导航底栏等直接导航到屏幕时,不会发生这种情况。

我们可能会遇到问题,例如,如果您在屏幕 A 中检索了一个在屏幕 B 中更新的列表。

在此场景中,屏幕 A 可以监听屏幕 B 中触发的插入事件。

init {
    viewModelScope.launch {
       _myList.value = databaseRepository.getAllItems()
    }

    databaseRepository.setListener(object : DatabaseRepository.Listener {
        override fun onItemRefresh() {
            _myList.value = databaseRepository.getAllItems()
    }
}

存储库:

interface DatabaseRepository {
  interface Listener {
      fun onItemRefresh()
  }
  fun insert(item: Item)
}

每次要插入项目时,都必须触发项目刷新事件:

class DBRepository(): DatabaseRepository {
  private var listener: DatabaseRepository.Listener? = null

  override fun insert(item: Item) {
    insert(item) // use any kind of DB insertion here
    listener?.onItemRefresh()
}

另一个解决方案是清理堆栈。

请查看本文:https://medium.com/@banmarkovic/jetpack-compose-clear-back-stack-popbackstack-inclusive-explained-14ee73a29df5

© www.soinside.com 2019 - 2024. All rights reserved.