android - 如何在 Jetpack Compose 中动态跟踪 BluetoothAdapter 状态变化?

在我的应用程序中,我想知道用户是否使用状态栏启用/禁用蓝牙并显示相关的 UI。为此,我认为我需要在我的 @Composable 函数中跟踪当前的 BluetoothAdapter.isEnabled 状态。这就是我所拥有的:

class MainActivity : ComponentActivity() {

    private val bluetoothAdapter: BluetoothAdapter by lazy {
        val bluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
        bluetoothManager.adapter
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        var isBluetoothEnabled = bluetoothAdapter.isEnabled

        setContent {
            AppTheme {
                MainScreen(isBluetoothEnabled)
            }
        }
    }
}

@Composable
private fun MainScreen(
    isBluetoothEnabled: Boolean
) {
    if (isBluetoothEnabled) {
        // Display some UI
    } else {
        // Display different UI
    }
}

当应用程序启动时,我可以获得应用程序的正确蓝牙状态,但由于 BluetoothAdapter.isEnabled 不是 @Composable 生命周期的一部分,我无法在之后跟踪它并对变化做出反应,就像它是一块的反应状态。有什么方法可以实现我想要的行为吗?

回答1

我能够通过使用 mutableStateOf 来解决这个问题。它不必在 @Composable 函数内部被初始化为反应性的,这是我首先误解的。

  1. 定义一个 mutableStateOf value 和一个 BroadcastReceiver 将跟踪 BluetoothAdapter 的状态。当蓝牙状态改变时,更新value。
private var isBluetoothEnabled = mutableStateOf(false)

    private val mReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            if (intent?.action == BluetoothAdapter.ACTION_STATE_CHANGED) {
                when (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR)) {
                    BluetoothAdapter.STATE_OFF -> {
                        isBluetoothEnabled.value = false
                        Log.i("Bluetooth", "State OFF")
                    }
                    BluetoothAdapter.STATE_ON -> {
                        isBluetoothEnabled.value = true
                        Log.i("Bluetooth", "State ON")
                    }
                }

            }
        }
    }
  1. @Composable 函数内部,像往常一样使用这个 value :
@Composable
private fun MainScreen(
    isBluetoothEnabled: Boolean
) {
    if (isBluetoothEnabled) {
        // Display some UI
    } else {
        // Display different UI
    }
}

就是这样!

相似文章

最新文章