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