You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 23:05:12