【问题标题】:Jetpack compose check if a function has been run in preview modeJetpack compose 检查函数是否已在预览模式下运行
【发布时间】:2022-02-09 01:01:12
【问题描述】:

这是否可以检查函数是否已在 Jetpack compose 中以预览模式运行?我有一个函数可以返回要在应用程序中使用的正确字符串,但是该函数使用了一些对象,这些对象禁用了 @Composable 组件的预览模式。我可以做的是将val isPreview: Boolean = false 标志传递给每个组件,然后如果标志是true,则运行一个简化的函数,但这会为每个可组合项添加一些样板代码。

【问题讨论】:

  • 根据此处发布的答案,我创建了一个optimized version,它适用于静态和交互模式预览。不在这里发布它作为答案,因为它只是对其他人的想法的扩展

标签: android kotlin android-jetpack-compose


【解决方案1】:

我通常通过调用LocalInspectionMode.current 来了解我是否处于预览模式。如果处于预览模式,则返回 true

以下是文档中关于 LocalInspectionMode 的内容:

可检查模式 CompositionLocal。如果组合是在 Inspectable 组件中组合的,则为真。

【讨论】:

  • 谢谢,它正在工作。这正是我一直在寻找的
【解决方案2】:

在 Android Studio 中预览项目时,他们不会(截至 2022 年 1 月)在 MainActivity 中托管 @Preview Jetpack Compose 代码。

这意味着您可以向上遍历 context.baseContext 树以确定您是在应用的 MainActivity 类中还是在另一个应用的顶级活动类中。我的顶级活动称为 MainActivity,所以:

fun Context.findMainActivityOrNull(): MainActivity?{
  var context = this
  while (context is ContextWrapper) {
    if (context is MainActivity) return context
    context = context.baseContext
  }
  return null
}

这样我就可以避免在预览时设置状态栏颜色,这样它就不会导致预览崩溃。

你这样调用上面的函数:

context.findMainActivityOrNull() //when in a non-@Composable area

如果你在 @Composable 函数中,那么你应该可以去:

LocalContext.current.findMainActivityOrNull()

您可以花哨并将行为不端的类包装在适配器中以使其整洁,或者在解决一些问题时检查上述结果是否为空。

【讨论】:

    【解决方案3】:

    这将违反可组合函数的函数范式。它应该是无状态的,并且不会关心它是在预览模式下运行还是在实际应用中运行,否则,将来当应用变得非常庞大时,您会遇到意想不到的错误。

    您应该尝试重构或重构您的可组合对象,使其仅依赖于字符串作为参数。预览模式可以为此组合发送硬编码字符串,但对于您的实际应用程序,您可以调用返回正确字符串(使用某些对象)的函数。

    更多关于“在 Compose 中思考”here

    【讨论】:

    • 我知道我可以使用字符串函数参数,但是当我的视图必须显示 10 个字符串并且所有字符串将始终相同并且控制仅对这些特定字符串有意义时会发生什么。现在每次我必须将 10 个字符串传递给这个可组合对象
    • “不会关心它是否在预览模式下运行” - 是的,理想情况下,但有时在现实世界中有真正的实际原因。例如:Coil SVG 库显示了一个错误,该错误导致预览崩溃但在运行时工作,您只想在预览中抑制该部分,以便您可以继续工作并稍后修复它。
    • Compose 预览窗口和 Android 环境之间存在差异的现实违反了可组合函数的功能范式。大多数在这里寻找解决方案的人都需要知道他们何时处于 @Preview 修饰部分,以便我们通过伪造 Android Studio 预览中未提供的项目来使他们的行为更多相似。
    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 2021-10-13
    • 2021-04-26
    • 2012-09-10
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多