我目前正在将旧的 Android 应用程序(基于 xml 视图)迁移到 Jetpack Compose。我对所有可组合项(视图)使用单个 Activity。我使用 NavController 进行导航。有一点不太明白:
在经典的 xml 视图中,例如,当您在特定屏幕上的文本字段中滚动或输入内容时,打开一个新的 Activity,然后按后退按钮,前一个屏幕上的滚动位置和文本输入仍然可见。在 Compose 中,按下后退按钮时屏幕会重置到起始位置。对于某些屏幕来说这不是问题,但对于其他屏幕来说则是问题。有人可以帮助我如何在 Compose 中解决这个问题吗?
在撰写中,一旦我们在屏幕上导航,它们就会被放入堆栈中。如果按后退按钮,我们将返回到上一屏幕并保持先前的状态,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()
}
另一个解决方案是清理堆栈。