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

如何从Activity向Composable函数传递广播接收器接收的数据?

最优实现方案:将Broadcast Receiver数据传递给Composable函数

方案一:使用Composable原生状态(简单场景)

直接利用Compose的状态感知特性,在Activity中定义可观察状态变量,触发UI自动重组:

  1. 修改DashboardActivity,添加状态变量并传递给Composable:
class DashboardActivity : AppCompatActivity(), BarcodeScanningReceiver.BarcodeScanningReceiverInterface {
    // 定义可观察的状态变量,存储条码数据
    private val barcodeDataState = mutableStateOf("")

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContent {
            AppTheme {
                // 将状态值传递给Composable函数
                LoadItemRankScreen(barcodeData = barcodeDataState.value)
            }
        }
    }

    override fun barcodeData(data: String) {
        // 更新状态变量,自动触发Composable重组刷新UI
        barcodeDataState.value = data
    }
}
  1. 修改LoadItemRankScreen,接收并使用条码数据:
@Composable
fun LoadItemRankScreen(barcodeData: String) {
    // 直接使用barcodeData做业务处理或UI展示
    Text(text = "扫描到的条码:$barcodeData")
    // 原有业务逻辑...
}

方案二:使用ViewModel(复杂业务/配置变化场景)

如果涉及多状态管理、业务逻辑分离,或需要避免屏幕旋转等配置变化导致数据丢失,推荐使用ViewModel:

  1. 创建ViewModel,封装状态和业务逻辑:
class ItemRankViewModel : ViewModel() {
    private val _barcodeData = MutableLiveData<String>()
    // 对外暴露不可变的LiveData
    val barcodeData: LiveData<String> = _barcodeData

    // 更新条码数据的方法
    fun updateBarcodeData(data: String) {
        _barcodeData.value = data
    }
}
  1. 修改DashboardActivity,关联ViewModel并传递状态:
class DashboardActivity : AppCompatActivity(), BarcodeScanningReceiver.BarcodeScanningReceiverInterface {
    // 通过viewModels()获取ViewModel实例
    private val viewModel: ItemRankViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContent {
            AppTheme {
                // 将LiveData转换为Composable可感知的State
                val barcodeData by viewModel.barcodeData.observeAsState("")
                LoadItemRankScreen(barcodeData = barcodeData)
            }
        }
    }

    override fun barcodeData(data: String) {
        // 调用ViewModel方法更新数据
        viewModel.updateBarcodeData(data)
    }
}
  1. LoadItemRankScreen的修改同方案一,只需接收barcodeData参数即可。

内容的提问来源于stack exchange,提问作者Maradiya Krupa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 15:53:13