如何从Activity向Composable函数传递广播接收器接收的数据?
最优实现方案:将Broadcast Receiver数据传递给Composable函数
方案一:使用Composable原生状态(简单场景)
直接利用Compose的状态感知特性,在Activity中定义可观察状态变量,触发UI自动重组:
- 修改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 } }
- 修改LoadItemRankScreen,接收并使用条码数据:
@Composable fun LoadItemRankScreen(barcodeData: String) { // 直接使用barcodeData做业务处理或UI展示 Text(text = "扫描到的条码:$barcodeData") // 原有业务逻辑... }
方案二:使用ViewModel(复杂业务/配置变化场景)
如果涉及多状态管理、业务逻辑分离,或需要避免屏幕旋转等配置变化导致数据丢失,推荐使用ViewModel:
- 创建ViewModel,封装状态和业务逻辑:
class ItemRankViewModel : ViewModel() { private val _barcodeData = MutableLiveData<String>() // 对外暴露不可变的LiveData val barcodeData: LiveData<String> = _barcodeData // 更新条码数据的方法 fun updateBarcodeData(data: String) { _barcodeData.value = data } }
- 修改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) } }
- LoadItemRankScreen的修改同方案一,只需接收
barcodeData参数即可。
内容的提问来源于stack exchange,提问作者Maradiya Krupa
相关产品推荐
相关产品推荐

