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