【问题标题】:Access sensors from within Composables in Jetpack Compose从 Jetpack Compose 中的 Composables 访问传感器
【发布时间】:2021-06-24 07:16:41
【问题描述】:

我仍然习惯于 Jetpack Compose,我正在尝试使用手机传感器,特别是在这种情况下的加速度计,但它可以是任何东西......

在标准的 Activity 流程中,我会获取 SensorManager 的一个实例并从那里开始,但鉴于 Jetpack Compose 的重点是 Routes,我不知道如何执行这样的任务。我们有一个 MainActivity.kt 在其中处理 Navigation。

我真的必须将 SensorManager 实例一直向下传递到我的 Composable 吗?简单地检测设备抖动似乎有些过分……如果设备抖动,请在 Composable 中执行此操作……

从更大的角度来看,这个问题也适用于您在标准生命周期方法中所做的任何事情,我猜...在 Header(...){} 组件中,我无权访问 onCreate 方法。我是否理解如果可组合组件需要依赖于生命周期,我必须将所有内容都备份到树中,类似于在没有 Redux 的情况下在 React 中所做的事情?

Compose 文档特别提到可以为“传感器之类的东西”管理状态,但是如何检索需要访问这些传感器的元素?

一如既往地感谢您的帮助。

【问题讨论】:

  • 为什么“检测设备抖动”是应用架构中活动的责任?
  • 我不会说这是一种责任,但如果在应用程序显示特定路线的内容时摇晃设备,我希望发生一些事情。
  • 这仍然不能解释为什么活动需要与传感器相关。一个活动可以做很多事情,例如磁盘 I/O 和网络 I/O。总的来说,对于任何类型的严肃工作,我们一直在将这些关注点从活动中移出并转移到其他对象(视图模型、存储库等)中。因此,也许您应该将传感器工作从活动中移出并移至其他对象(例如,视图模型),在这些对象中,那些其他对象公开您的可组合项可以使用的 API(例如,BroadcastChannel 用于抖动事件)。
  • 在 ViewModel 中与否,我仍然需要能够在某处实例化 SensorManager。考虑到 Jetpack Compose 最近非常非常非常古怪的冒险,让我们面对现实吧,围绕它的有限用户群,以及有限的经过验证的示例,正​​如你所说,没有多少“严肃的工作”,在现在生产。现在,我知道你写了关于这个主题的书,但坦率地说,你觉得有点自负。我很感激帮助,我真的很感激。但这对大多数人来说是新的。
  • 让我们假设您坚持使用当前的View 系统而不是使用 Compose UI。除了琐碎的应用程序之外,让活动检测震动对于当前的应用程序架构方法仍然没有意义。 “但这对大多数人来说是新的”——谷歌关于应用程序架构的建议已经有四年左右的历史了,在此之前的几年里,还有很多其他行业专家在谈论同样的事情。 Compose 是新的,但我在最初的评论中提出的问题不是。 Compose 只是更加强调架构。

标签: android android-jetpack android-jetpack-compose


【解决方案1】:

你可以使用:

@Composable
fun myComposable() {

    val sensorManager = LocalContext.current.getSystemService(SENSOR_SERVICE) as SensorManager
    //...
}

【讨论】:

    猜你喜欢
    • 2022-06-19
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多