问题标签 [android-jetpack-compose-preview]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2130 浏览

android - Jetpack Compose 嵌套主题预览

让我们考虑以下@Composable功能:

和主题(注意: AppTheme遵循相同的逻辑):

预览窗口将正确显示两个 WelcomeScreen 版本,但深色版本不会显示深色主题中的按钮。
运行应用程序一切正常,这只是一个预览“问题”。

所以,我的问题是:这是预期的行为、错误还是配置错误?

完整代码在这里:https ://github.com/GuilhE/JetpackChallenge

0 投票
1 回答
1027 浏览

android-jetpack-compose - 如何在横向模式下预览 Compose 布局

我正在使用 Android Studio Bumblebee 2021.1.1 Canary 3 + Compose 1.0-rc02,似乎没有简单的方法可以强制使用横向模式进行预览,其中包括使用-land/资源文件夹中的资源(特别是维度)。

我知道这种行为在理论上是可能的,因为 using@Preview(device = Devices.AUTOMOTIVE_1024p)将使用正确的资源值。但是,这不是一个可行的预览选项,因为与默认预览设备相比,像素密度是关闭的。(即使调整预览的宽度、高度和字体比例,图标的大小仍然不正确。)

我能够做到这一点,以便我的 UI 代码使用以下包装器检测横向

但是,这并不能解决上述问题,即不使用dimensionResource().

有任何想法吗?

0 投票
3 回答
903 浏览

android-studio - Studio BumbleBee 用于 Compose 预览的“渲染问题”

我无法在 Studio 中预览任何东西,延伸到像Text. 我得到一个“渲染错误”,揭示了这个堆栈跟踪。

这似乎是在 Bumblebee Studio 早前两到三个更新之后才发生的,这引起了很多不适。

我刚刚意识到,我可能应该在 issuetracker 上将此作为问题归档,但现在我已经输入了这个问题,而且我不会浪费这个辛苦的工作。

除了笑话,如果有人以前偶然发现过这个,并且可能有解决办法,请分享。这是 AGP 或其他组件的已知问题吗?欢迎使用解决方法。

谢谢

0 投票
1 回答
415 浏览

android - Jetpack Compose - 预览不会实时呈现

我将 Compose 与 AS Arctic Fox v2020.3.1 一起使用。当我更新代码时,预览不会实时呈现。如显示消息“预览已过期”,我必须单击“构建和刷新”。我希望它能够实时呈现 UI,类似于 XML 设计。

怎么做?

提前致谢。

在此处输入图像描述

0 投票
0 回答
301 浏览

android - 在 Jetpack Compose 中跨可组合函数重用一组预览注释

在 Jetpack Compose 中迈出第一步,除了一个烦人的问题外,这非常了不起。

我有一组恒定的预览:正常、黑暗和 RTL:

比如说,我预览了 50 个可组合函数。我需要复制粘贴这组 50 次,这是绝对不正确的。

注释继承是被禁止的,所以我的问题是:有没有人找到一种方法在所有可组合函数中重用同一组预览?

我能想到的唯一2个解决方案是:

  • 在开发时使用多个自定义预览。
  • 部分重用预览 - 使用名称和组的编译时常量。

编辑:

我创建了一个功能请求来组成团队,以便能够创建自定义注释并使用我想要重用的所有预览来注释注释。

这样我只需要使用我的自定义注释。

可以在Google 问题跟踪器中进行跟踪

0 投票
1 回答
141 浏览

android - 您可以在 Jetpack Compose 预览版中展开 DropdownMenu 吗?

我有以下可组合的函数,它创建一个TopAppBar. 预览显示栏很好,但我可以让菜单在预览中展开吗?

0 投票
2 回答
271 浏览

android - JetpackCompose 中 @Preview 的 isInEditMode 模拟

我正在使用 Jetpack compose 开发应用程序,但在 Jetpack 预览期间导入字体时遇到问题。预览为空并显示错误(渲染问题):

例如,在自定义视图中,我们有一个

在设计部分控制布局预览,我们可以禁用一些破坏预览的逻辑。

Jetpack @Preview 有什么办法吗?我目前阅读了所有可用的文档/文章,但没有找到答案。

非常感谢您提供任何信息。

Jetpack Compose 代码为:

0 投票
3 回答
506 浏览

android-studio - Jetpack Compose 预览版在带有补丁 1 的北极狐中停止工作

随着 AS Arctic Fox Jetpack Compose 预览版的第一个补丁停止工作。

我在所有预览中都遇到了这个错误 - 甚至是旧的,它在一段时间前运行良好:

这里有什么快速解决方法吗?清除缓存和通常的东西不起作用。


编辑:
看起来问题并不总是存在。一些预览开始工作,而另一些仍然失败。

编辑2:
这发生在动态功能模块中,当需要来自主模块的资源或painterResource()正在使用时(即使是来自同一模块的资源也将被显示)。

0 投票
1 回答
199 浏览

android - Jetpack Compose Preview 使用 ThreeTen 的 LocalDate.now() 失败

当我们有一些代码从中调用 LocalDate.now() 时,渲染 Jetpack Compose Preview 会失败。我们已尝试在预览中设置区域设置,但这无济于事,而且我们还没有找到任何其他方法来在预览中设置上下文信息。

我们怎样才能做到这一点?

预览渲染问题堆栈跟踪:

org.threeten.bp.zone.ZoneRulesException:在 org.threeten.bp.zone.ZoneRulesProvider.getRules(ZoneRulesProvider 的 org.threeten.bp.zone.ZoneRulesProvider.getProvider(ZoneRulesProvider.java:165) 处没有注册时区数据文件.java:122) 在 org.threeten.bp.ZoneRegion.ofId(ZoneRegion.java:143) 在 org.threeten.bp.ZoneId.of(ZoneId.java:358) 在 org.threeten.bp.ZoneId.of( ZoneId.java:286) 在 org.threeten.bp.ZoneId.systemDefault(ZoneId.java:245) 在 org.threeten.bp.Clock.systemDefaultZone(Clock.java:137) 在 org.threeten.bp.LocalDate.now (LocalDate.java:165) 在 xxx.ui.shared.formatter.OrderDateFormatter.getFormattedTimes(OrderDateFormatter.kt:12) 在 xxx.model.Pickup.displayCreatedTime(Pickup.kt:55) 在 xxx.ui.orderStatus.pickups。 PickupsListKt.DateRows(PickupsList.kt:268) 在 xxx.ui.orderStatus.pickups.PickupsListKt。PickupPanelDetails(PickupsList.kt:129) at xxx.ui.orderStatus.pickups.PickupsListKt.PickupPanel(PickupsList.kt:78) at xxx.ui.orderStatus.pickups.PickupsListKt$PickupsList$1$1.invoke(PickupsList.kt:51)在 xxx.ui.orderStatus.pickups.PickupsListKt$PickupsList$1$1.invoke(PickupsList.kt:49) 在 androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107) 在 androidx.compose.runtime .internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) at xxx.ui.shared.composables.LoadingComposableKt.LoadingComposable(LoadingComposable.kt:39) at xxx.ui.orderStatus.pickups.PickupsListKt.PickupsList(PickupsList.kt :49) at xxx.ui.orderStatus.pickups.ComposableSingletons$PickupsListKt$lambda-1$1.invoke(PickupsList.kt:337) at xxx.ui.orderStatus.pickups.ComposableSingletons$PickupsListKt$lambda-1$1.invoke(PickupsList .kt:336) 在 androidx。compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) at xxx.ui.shared.appTheme.AppThemeKt$ AppTheme$1.invoke(AppTheme.kt:56) at xxx.ui.shared.appTheme.AppThemeKt$AppTheme$1.invoke(AppTheme.kt:55) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm. kt:107) 在 androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) 在 androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:215) 在 androidx.compose.material.TextKt .ProvideTextStyle(Text.kt:252) at androidx.compose.material.MaterialThemeKt$MaterialTheme$1.invoke(MaterialTheme.kt:81) at androidx.compose.material.MaterialThemeKt$MaterialTheme$1.invoke(MaterialTheme.kt:80) at安卓x。compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107) 在 androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) 在 androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider( CompositionLocal.kt:215) 在 androidx.compose.material.MaterialThemeKt.MaterialTheme(MaterialTheme.kt:72) 在 xxx.ui.shared.appTheme.AppThemeKt.AppTheme(AppTheme.kt:55) 在 xxx.ui.orderStatus.pickups .PickupsListKt.DefaultPickupsListPreview(PickupsList.kt:336) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:566) 在 androidx.compose.ui.tooling.CommonPreviewUtils.invokeComposableViaReflection$ui_tooling_release(CommonPreviewUtils.kt:188) 在 androidx.compose.ui.tooling 的 androidx.compose.ui.tooling.CommonPreviewUtils.invokeComposableMethod(CommonPreviewUtils.kt:149) .ComposeViewAdapter$init$3$1$composable$1.invoke(ComposeViewAdapter.kt:571) at androidx.compose.ui.tooling.ComposeViewAdapter$init$3$1$composable$1.invoke(ComposeViewAdapter.kt:569) at androidx.compose.ui .tooling.ComposeViewAdapter$init$3$1.invoke(ComposeViewAdapter.kt:608) at androidx.compose.ui.tooling.ComposeViewAdapter$init$3$1.invoke(ComposeViewAdapter.kt:564) at androidx.compose.runtime.internal.ComposableLambdaImpl .invoke(ComposableLambda.jvm.kt:107) 在 androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) 在 androidx.compose.runtime。CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:215) at androidx.compose.ui.tooling.InspectableKt.Inspectable(Inspectable.kt:64) at androidx.compose.ui.tooling.ComposeViewAdapter$WrapPreview$1.invoke(ComposeViewAdapter.kt:513 ) 在 androidx.compose.ui.tooling.ComposeViewAdapter$WrapPreview$1.invoke(ComposeViewAdapter.kt:512) 在 androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107) 在 androidx.compose.runtime .internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) 在 androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:215) 在 androidx.compose.ui.tooling.ComposeViewAdapter.WrapPreview(ComposeViewAdapter.kt:508 ) 在 androidx.compose.ui.tooling 的 androidx.compose.ui.tooling.ComposeViewAdapter.access$WrapPreview(ComposeViewAdapter.kt:121)。ComposeViewAdapter$init$3.invoke(ComposeViewAdapter.kt:564) at androidx.compose.ui.tooling.ComposeViewAdapter$init$3.invoke(ComposeViewAdapter.kt:561) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda. jvm.kt:107) 在 androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) 在 androidx.compose.ui.platform.ComposeView.Content(ComposeView.android.kt:384) 在 androidx .compose.ui.platform.AbstractComposeView$ensureCompositionCreated$1.invoke(ComposeView.android.kt:228) at androidx.compose.ui.platform.AbstractComposeView$ensureCompositionCreated$1.invoke(ComposeView.android.kt:227) at androidx.compose .runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107) 位于 androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) 位于 androidx.compose。runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:215) 在 androidx.compose.ui.platform.CompositionLocalsKt.ProvideCommonCompositionLocals(CompositionLocals.kt:148) 在 androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$3.invoke(AndroidCompositionLocals.android .kt:114) 在 androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$3.invoke(AndroidCompositionLocals.android.kt:113) 在 androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)在 androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) 在 androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:215) 在 androidx.compose.ui.platform.AndroidCompositionLocals_androidKt。在 androidx.compose.ui.platform.WrappedComposition$setContent$1$1$3.invoke(Wrapper.android.kt:162) 在 androidx.compose.ui.platform.WrappedComposition$setContent$1$1 提供AndroidCompositionLocals(AndroidCompositionLocals.android.kt:106) $3.invoke(Wrapper.android.kt:161) 在 androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107) 在 androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm. kt:34) 在 androidx.compose.ui.platform.WrappedComposition$setContent$1$1.invoke(Wrapper.android.kt:161) 在 androidx.compose.kt.CompositionLocalProvider(CompositionLocal.kt:215) 在 androidx.compose .ui.platform.WrappedComposition$setContent$1$1.invoke(Wrapper.android.kt:144) 在 androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107) 在 androidx。compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) at androidx.compose.runtime.ComposerKt.invokeComposable(Composer.kt:3336) at androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke( Composer.kt:2583) 在 androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke(Composer.kt:2579) 在 androidx.compose.runtime.SnapshotStateKt.observeDerivedStateRecalculations(SnapshotState.kt:540) 在 androidx.compose.runtime .ComposerImpl.doCompose(Composer.kt:2572) 在 androidx.compose.runtime.ComposerImpl.composeContent$runtime_release(Composer.kt:2523) 在 androidx.compose.runtime.CompositionImpl.composeContent(Composition.kt:476) 在 androidx。 compose.runtime.Recomposer.composeInitial$runtime_release(Recomposer.kt:727) 在 androidx.compose.ui.platform 的 androidx.compose.runtime.CompositionImpl.setContent(Composition.kt:432)。WrappedComposition$setContent$1.invoke(Wrapper.android.kt:144) 在 androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:135) 在 androidx.compose.ui.platform.AndroidComposeView。 setOnViewTreeOwnersAvailable(AndroidComposeView.android.kt:733) 在 androidx.compose.ui.platform.WrappedComposition.setContent(Wrapper.android.kt:135) 在 androidx.compose.ui.platform.WrappedComposition.onStateChanged(Wrapper.android.kt: 187) 在 androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:354) 在 androidx.lifecycle.LifecycleRegistry.addObserver(LifecycleRegistry.java:196) 在 androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke( Wrapper.android.kt:142) 在 androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:135) 在 androidx.compose.ui.platform。AndroidComposeView.onAttachedToWindow(AndroidComposeView.android.kt:820) 在 android.view.View.dispatchAttachedToWindow(View.java:20479) 在 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3489) 在 android.view.ViewGroup.dispatchAttachedToWindow (ViewGroup.java:3496) 在 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3496) 在 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3496) 在 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:第 3496 章:360) 在 com.android.tools.idea.layoutlib.LayoutLibrary 的 com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:431)。createSession(LayoutLibrary.java:141) 在 com.android.tools.idea.rendering.RenderTask.createRenderSession(RenderTask.java:714) 在 com.android.tools.idea.rendering.RenderTask.lambda$inflate$7(RenderTask.java :870) 在 com.android.tools.idea.rendering.RenderExecutor$runAsyncActionWithTimeout$2.run(RenderExecutor.kt:187) 在 java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) 在 java .base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) 在 java.base/java.lang.Thread.run(Thread.java:834)在 java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) 在 java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:第628章)在 java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) 在 java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:第628章)

0 投票
2 回答
1034 浏览

android - Jetpack Compose 状态提升、预览和 ViewModels 最佳实践

因此,在 Jetpack Compose 中似乎推荐的做法是从您的可组合项中提升状态,使它们成为无状态、可重用和可测试的,并允许在预览中轻松使用它们。所以而不是有类似的东西

你会像这样提升状态

这很好,但是一些更复杂的用途呢?假设我有一个由可组合对象表示的屏幕,在 View 和 ViewModel 之间有多个交互。这个屏幕被分成多个内部可组合(例如,一个用于标题,一个用于正文,然后又分为几个较小的可组合)

  • 您不能在可组合物中创建 ViewModel(viewModel()至少,您可以手动实例化一个)并在 a 中使用此可组合物Preview(预览不支持像这样创建视图模型)
  • 在内部可组合项中使用 ViewModel 会使它们成为有状态的,不是吗?

因此,我看到的“最干净”的解决方案是仅在最高可组合级别实例化我的视图模型,然后将仅val代表状态的子可组合传递给子组件,并回调 ViewModel 函数。

但这很疯狂,我不会通过单个参数将我的所有 ViewModel 状态和函数传递给所有需要它们的可组合组件。data class例如,将它们分组可能是一个解决方案

也许为回调创建另一个?但这仍然是创建一个全新的类,只是为了模仿视图模型已经拥有的东西。

我实际上并没有看到这样做的最佳方法是什么,而且我在任何地方都没有找到任何相关信息