Как получить предыдущее значение из SharedFlow после воссоздания действия/изменения конфигурации в Jetpack Compose?

Предположим, у меня есть ScanActivity используя реактивный ранец, который может сканировать штрих-код, результат будет показан в TextFieldи результат сохранится от изменения конфигурации (например, поворот экрана). я не буду использовать StateFlow потому что после показанного результата я поворачиваю экран, он снова вызывает API, но результат становится пустым, я хочу сохранить результат.

Активность сканирования:

      class ScanActivity : BaseActivity(){

    private val scanViewModel: ScanViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
   
    setContent {
      val detectedBarcode by scanViewModel.detectedBarcode.collectAsState(initial = null)
    
     LaunchedEffect(detectedBarcode){                
    //API Call
    ...
    //
      scanViewModel.setBarcodeField(detectedBarcode?.rawValue ?: "")
    }
    
    MyTextField()

}}

Сканвиевмодель:

      class ScanViewModel: ViewModel(){

    val detectedBarcode = MutableSharedFlow<Barcode>()
    val barcodeResultField = MutableLiveData<String>()

    fun setBarcodeField(barcode: String) {
        barcodeResultField.postValue(barcode)
    }
}

Мое текстовое поле:

      @Composable
fun MyTextField(scanViewModel: ScanViewModel = viewModel()){
    val barcode by scanViewModel.barcodeResultField.observeAsState("")
    TextField(value = barcode, onValueChange = {brc ->
            scanViewModel.setBarcodeField(brc)
        },
            label = {
                Text(text = "Barcode Field")
            })

}

1 ответ

Присвойте SharedFlow количество повторов, равное 1, чтобы он воспроизводил самые последние выпуски для новых подписчиков.

      val detectedBarcode = MutableSharedFlow<Barcode>(replay = 1)
Другие вопросы по тегам