在View中调用时ViewModel的qrImage变量为空问题
Jetpack Compose中ViewModel生成QR图片后新页面获取变量为空的问题
调用CreateQrViewModel的createQrCode方法生成QR图片后,ViewModel内部日志显示qrImage变量已成功赋值,但在DownloadQrScreen中获取该变量时始终为空,已通过View和ViewModel的日志打印确认此现象。
ViewModel代码(QR图片生成逻辑)
@HiltViewModel class CreateQrViewModel @Inject constructor( private val qrUseCases: QrUseCases ) : ViewModel() { //private val _qrState = MutableStateFlow(CreateQrState()) //val qrState = _qrState.asStateFlow() var qrName by mutableStateOf("") var qrUrl by mutableStateOf("") val qrImage = mutableStateOf<ImageBitmap?>(null) fun createQrCode() { Log.i("QR Code Name: ", qrName) Log.i("QR Code URL: ", qrUrl) viewModelScope.launch(Dispatchers.IO) { // Run on IO thread try { val createdDate = Calendar.getInstance() val qrModel = QrModel(qrName = qrName, qrUrl = qrUrl, createdDate = createdDate) qrUseCases.addQrUseCase(qrModel) val qrData = "${qrModel.qrName} - ${qrModel.qrUrl}" val generatedImage = QRCodeGenerator.generateQRCode(qrData) qrImage.value = generatedImage //_qrState.value = CreateQrState(qrName = qrName, qrUrl = qrUrl, qrImage = generatedImage) Log.i("QR CODE: ", qrImage.toString()) //_qrImage.value?.let { saveImage(it) } } catch (e: Exception) { e.printStackTrace() Log.e("Creating QR code failed:", "Failed", e) } } } }
CreateQrScreen中调用createQrCode的代码
Button( onClick = { viewModel.createQrCode() Log.i("QR CODE IMAGE", viewModel.qrImage.toString()) navController.navigate(route = NavigationRoutes.Download.route) }, modifier = Modifier .height(80.dp) .padding(8.dp) .fillMaxWidth() ) { Text("Create QR Code") }
DownloadQrScreen代码(日志显示qrImage为空)
@OptIn(ExperimentalMaterial3Api::class) @Composable fun DownloadQrScreen( navigateUp: () -> Unit, viewModel: CreateQrViewModel = hiltViewModel() ) { //val qrState = viewModel.qrState.collectAsState().value val qrImage = viewModel.qrImage.value if(qrImage == null) { Log.i("QR CODE IS NULL", viewModel.qrImage.value.toString()) } else { Log.i("QR CODE", "QR CODE IS NOT Null") } }
已尝试过的方案:
- 使用
MutableStateFlow管理状态 - 使用
mutableState管理状态
两种方式下,View中获取qrImage始终为空。
内容的提问来源于stack exchange,提问作者Shem Tom
相关产品推荐
相关产品推荐

