Как получить предыдущее значение из 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)