gpt4 book ai didi

android - 为什么在 Jetpack Compose 中多次调用此函数?

转载 作者:行者123 更新时间:2023-12-04 23:43:49 26 4
gpt4 key购买 nike

我目前正在试用 Android Compose。我有一个显示加密硬币价格的文本。如果价格上涨,文本的颜色应该是绿色,但如果价格下跌,它应该是红色。当用户单击按钮时调用该函数。问题是函数 showPrice()被调用多次(有时只是一次,有时是 2-4 次)。因此,用户可以看到错误的颜色。我能做些什么来确保它只被调用一次?
主要 Activity :

@Composable
fun MainScreen() {
val priceLiveData by viewModel.trackLiveData.observeAsState()
val price = priceLiveData ?: return

when (price) {
is ViewState.Response -> showPrice(price = price.data)
is ViewState.Error -> showError(price.text)
}

Button(onClick = {viewModel.post()} )
}

@Composable
private fun showPrice(price: Double) {
lastPrice = sharedPref.getFloat("eth", 0f).toDouble()
val color by animateColorAsState(if (price >= (lastPrice)) Color.Green else
Color.Red)
Log.v("TAG", "last=$lastPrice new = $price")
editor.putFloat("eth", price.toFloat()).apply()
Text(
text = price.toString(),
color = color,
fontSize = 28.sp,
fontFamily = fontFamily,
fontWeight = FontWeight.Bold
)
}
查看型号:
  @HiltViewModel
class MyViewModel @Inject constructor(
private val repository: Repository
): ViewModel() {

private val _trackLiveData: MutableLiveData<ViewState<Double>> = MutableLiveData()
val trackLiveData: LiveData<ViewState<Double>>
get() = _trackLiveData

fun post(
) = viewModelScope.launch(Dispatchers.Default) {
try {
val response = repository.post()
_trackLiveData.postValue(ViewState.Response(response.rate.round(7)))
} catch (e: Exception) {
_trackLiveData.postValue(ViewState.Error())
Log.v("TAG: viewmodelPost", e.message.toString())
}
}
}
View 状态:
sealed class ViewState<out T : Any> {
class Response<out T : Any>(val data: T): ViewState<T>()
class Error(val text:String = "Unknown error"): ViewState<Nothing>()
}
所以当我按下按钮调用 showPrice() 时。我可以在日志上看到这些行:
2021-06-10 16:39:18.407 16781-16781/com.myapp.myapp V/TAG: last=2532.375732421875 new = 2532.7403716
2021-06-10 16:39:18.438 16781-16781/com.myapp.myapp V/TAG: last=2532.740478515625 new = 2532.7403716
2021-06-10 16:39:18.520 16781-16781/com.myapp.myapp V/TAG: last=2532.740478515625 new = 2532.7403716

最佳答案

What can I do to ensure that it's only called once?


没什么,这就是它的工作方式。在 View 系统中,您不会问“为什么我的 View 无效 3 次?”。框架根据需要使 View 无效(重组),您不需要知道或关心何时发生这种情况。
您的代码的问题是您的 Composable 正在从首选项中读取旧值,这不是它应该如何工作的,该值应该由 View 模型作为状态的一部分提供。不要只提供新价格,而是公开一个同时具有新旧价格的数据类,然后在您的可组合物中使用这两个值来确定要显示的颜色,或者公开要使用的价格和颜色。

关于android - 为什么在 Jetpack Compose 中多次调用此函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67922585/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com