0

假设我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")
            })

}
4

1 回答 1

2

将您的 SharedFlow 的重播量设为 1,以便它将最近的排放重播给新订阅者。

val detectedBarcode = MutableSharedFlow<Barcode>(replay = 1)
于 2022-01-27T05:12:53.380 回答