如何在触发点击时随机播放列表

How to shuffle list whenever click is triggered

我有 Json 数据,我正在通过这些数据执行此操作。

 fun getFact(context: Context) = viewModelScope.launch{
    try {
        val format = Json {
            ignoreUnknownKeys = true
            prettyPrint = true
            isLenient = true
        }

        val factJson = context.assets.open("Facts.json").bufferedReader().use {
            it.readText()
        }
        val factList = format.decodeFromString<List<FootballFact>>(factJson)
        _uiState.value = ViewState.Success(factList)
        } catch (e: Exception) {
        _uiState.value = ViewState.Error(exception = e)
    }
}

这就是我在 Ui sceeen

中从 viewModle 获得工作的方式
    viewModel.getFact(context)  


when (val result = 
viewModel.uiState.collectAsState().value) {
        is ViewState.Error -> {
            Toast.makeText(
                context,
                "Error ${result.exception}",
                Toast.LENGTH_SHORT
            ).show()
        }

        is ViewState.Success -> {
            val factsLists = mutableStateOf(result.fact)
            val randomFact = factsLists.value[0]

            FactCard(quote = randomFact.toString()) {
                factsLists.value.shuffled()
            }

        }
    }

我有事实卡,我想在其中显示该事实。我还有一个用于单击的 lambda,我希望每次单击时刷新我的事实列表。

@Composable
fun FactCard(quote: String , onClick : ()-> Unit) {
    
   val fact = remember { mutableStateOf(quote)}
    
   Box(
        contentAlignment = Alignment.Center,
        modifier = Modifier.
                .clickable { onClick() }
        ) {
    
           Text(.. )
       }
}

我不知道如何处理这个问题,我认为我在做一些愚蠢的事情。

可组合项只能在您更新状态数据时进行重组。你没有那样做。您的点击事件应该 return 您要显示的新报价。然后将 fact.value 设置为新报价。使用新值调用 fact.value 是触发重组的原因:

when (val result = viewModel.uiState.collectAsState().value) {
    is ViewState.Error -> {
         Toast.makeText(
              context,
              "Error ${result.exception}",
              Toast.LENGTH_SHORT
         ).show()
    }

    is ViewState.Success -> {
         val factsLists = mutableStateOf(result.fact)
         val randomFact = factsLists.value[0]

         FactCard(quote = randomFact.toString()) {
              return factsLists.value.shuffled()[0]
         }

    }
}

@Composable
fun FactCard(quote: String , onClick : ()-> String) {
  
 var fact = remember { mutableStateOf(quote)}
  
 Box(
        contentAlignment = Alignment.Center,
        modifier = Modifier.
                  .clickable { 
                  fact.value = onClick() 
            }
        ) {
  
            Text(.. )
      }
}

factsLists.shuffled() returns 一个新列表,其中的元素随机排列。