我已经创建了一个底部导航栏,其中有三个片段,现在,让我们说片段1,2和3。我已经启用了一个实时数据观察器,它显示一个消息,每当一个api返回错误消息。消息然后显示给用户通过snackbar。我有一些问题,显示消息时,我的应用程序崩溃。我已经纠正了错误。
应用程序不再崩溃,但我遇到了另一个问题。假设在片段3中有一个错误消息“未找到用户”。该消息显示在snackbar中。但当我导航回片段1或2时,snackbar中显示相同的错误消息。我检查了API响应,没有错误响应。
private val errorObserver = Observer<Int>{
activity?.let { it1 -> Snackbar.make(it1.findViewById(android.R.id.content), it, Snackbar.LENGTH_SHORT).show() }}
这是我用来解决第一个崩溃问题的代码。我不知道如何解决第二个问题。
1条答案
按热度按时间gr8qqesn1#
你的问题可能是(你还没有发布太多代码)你把错误状态保存在
LiveData
或StateFlow
中。当你的Fragment
启动并开始观察那个错误状态时,如果有一个当前值那么观察器会立即接收到它,并处理它(例如,通过显示一个Snackbar
)。当你的UI需要更新以显示当前的 * 状态 * 时,这是很好的,但是看起来你的错误是一个 * 事件 *,一些短暂的发生然后消失的东西。你基本上需要在处理完错误后清除它,这样观察到的任何东西都不会看到同样的错误。
评论中提到了 SingleLiveEvent 方法,但这是the Android team considers an antipattern now的旧解决方案。这里解释了使用UI事件的推荐方法,但基本上是这样的:
ViewModel
中,某个UI状态对象(例如,错误状态,或描述整个UI的对象,其中包含错误状态字段)更新以保存错误值所以在你的例子中,只要你显示snackbar,你就告诉ViewModel(或者你正在做的事情)清除那个错误,因为它是一个已经被处理的事件。这不同于持久的错误状态,例如,如果有一个问题需要解决,你会一直显示一个警告图标(直到错误状态改变)