【问题标题】:Compose not listening to any repeated value撰写不听任何重复值
【发布时间】:2021-11-09 20:15:37
【问题描述】:

我有一个屏幕监听包含我需要的一切的数据类。 ScreenState。每当用户按下按钮时,我都会将事件发送到 ViewModel。 这个特定事件只是像这样在 ScreenState 参数上获取意图和设置。

screenStateFlow.emit(
    ScreenState(
        Intent(...)
    )
)

发生了什么,第一次工作(用户离开应用程序,然后返回应用程序)。当用户回到应用程序并且没有来自意图的任何数据并希望他们能够再次启动意图时。所以它执行相同的操作。

触发获取意图并设置 ScreenState 参数的特定事件,并再次发出此值

问题就在这里。价值是一样的。所以 compose 不会自己重构。

这个解决方案有效。你可以说我不需要所有这些,它可以通过启动意图来工作,而不必经历事件过程等等。但我想要那样(除非我找不到正确的解决方案)

screenStateFlow.emit(
    ScreenState(
        Intent(...),
        !triggerRecompose
    )
)

有没有更好的解决方案?

编辑: Someone having the same issue as me, the provided answer didn't work. 我已经在 ViewModel 中尝试过 MutableState 和 State 。没用

【问题讨论】:

  • “我有一个屏幕正在监听一个对象”——这是什么意思? “只要这个对象重复自身(例如相同的字符串),compose 就不会做任何动作”——我认为那是StateFlow,而不是 Compose。 StateFlow 适用于内容相等性,因此如果您尝试发出与上次发出的值相等的值,它实际上不会做任何事情。
  • 是的,抱歉是指数据类。喜欢StateViewModel。我尝试使用 StateFlow 和 SharedFlow。无法正常工作,因为我将与前一个相同的值传递给此数据类。
  • 这不是正确的方法。如果你想触发状态,那肯定是有原因的。就像你想要刷新一些 UI 组件之类的。因此,您应该修改该变量,而不是手动触发重组。如果您不确定如何使用,请为用例发布一些代码。
  • 好吧,给我一秒钟来编辑我的具体情况的帖子。 @MARSK
  • 已编辑@MARSK

标签: android android-jetpack-compose


【解决方案1】:

我有一个类似的问题,我想触发一个快餐栏,即使值是重复的。

我通过向我的消息对象添加一个可变参数(例如时间戳或 Math.random())来解决它。

这样,即使消息内容相同,Message对象不同,也会触发状态变化。

【讨论】:

  • 是的,我通过在参数中更改之前的值(如 !previousValue)对布尔触发器做了同样的事情,但我仍然不喜欢这个解决方案
猜你喜欢
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
  • 2022-10-12
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多