在 Jetpack Compose 发生 Activity recreate/Configuration 更改后,如何从 SharedFlow 获取以前的值?

How do I get previous value from SharedFlow after Activity recreate/Configuration change in Jetpack Compose?

假设我 ScanActivity 使用可以扫描条码的 jetpack compose,结果将显示在 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")
            })

}

将您的 SharedFlow 的重播量设置为 1,以便它向新订阅者重播最近发布的内容。

val detectedBarcode = MutableSharedFlow<Barcode>(replay = 1)