提问人:Morten Holmgaard 提问时间:10/7/2021 更新时间:10/7/2021 访问量:1298
Jetpack Compose 预览失败,并显示 ThreeTen 的 LocalDate.now()
Jetpack Compose Preview failing with LocalDate.now() from ThreeTen
问:
当我们有一些代码从 Jetpack Compose Preview 调用 LocalDate.now() 时,渲染它失败。我们尝试在预览上设置区域设置,但这无济于事,并且我们没有找到任何其他方法来在预览上设置上下文信息。
我们怎样才能做到这一点?
预览渲染问题堆栈跟踪:
org.threeten.bp.zone.ZoneRulesException:无时区数据文件 注册于 org.threeten.bp.zone.ZoneRulesProvider.getProvider(ZoneRulesProvider.java:165) 在 org.threeten.bp.zone.ZoneRulesProvider.getRules(ZoneRulesProvider.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(时钟.java:137) 在 org.threeten.bp.LocalDate.now(LocalDate.java:165) 在 xxx.ui.shared.formatter.OrderDateFormatter.getFormattedTimes(订单日期Formatter.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) 在 xxx.ui.orderStatus.pickups.PickupsListKt.PickupPanel(PickupsList.kt:78) 在 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) 在 xxx.ui.shared.composables.LoadingComposableKt.LoadingComposable(LoadingComposable.kt:39) 在 xxx.ui.orderStatus.pickups.PickupsListKt.PickupsList(PickupsList.kt:49) 在 xxx.ui.orderStatus.pickups.ComposableSingletons$PickupsListKt$lambda-1$1.invoke(PickupsList.kt:337) 在 xxx.ui.orderStatus.pickups.ComposableSingletons$PickupsListKt$lambda-1$1.invoke(PickupsList.kt:336) 在 androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107) 在 androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) 在 xxx.ui.shared.appTheme.AppThemeKt$AppTheme$1.invoke(AppTheme.kt:56) 在 xxx.ui.shared.appTheme.AppThemeKt$AppTheme$1.invoke(AppTheme.kt:55) 在 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) 在 androidx.compose.material.MaterialThemeKt$MaterialTheme$1.invoke(MaterialTheme.kt:81) 在 androidx.compose.material.MaterialThemeKt$MaterialTheme$1.invoke(MaterialTheme.kt:80) 在 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.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(本机 方法)在 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) at androidx.compose.ui.tooling.CommonPreviewUtils.invokeComposableMethod(CommonPreviewUtils.kt:149) 在 androidx.compose.ui.tooling.CommonPreviewUtils.invokeComposableViaReflection$ui_tooling_release(CommonPreviewUtils.kt:188) 在 androidx.compose.ui.tooling.ComposeViewAdapter$init$3$1$composable$1.invoke(ComposeViewAdapter.kt:571) 在 androidx.compose.ui.tooling.ComposeViewAdapter$init$3$1$composable$1.invoke(ComposeViewAdapter.kt:569) 在 androidx.compose.ui.tooling.ComposeViewAdapter$init$3$1.invoke(ComposeViewAdapter.kt:608) 在 androidx.compose.ui.tooling.ComposeViewAdapter$init$3$1.invoke(ComposeViewAdapter.kt:564) 在 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.InspectableKt.Inspectable(Inspectable.kt:64) 在 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.ComposeViewAdapter.access$WrapPreview(ComposeViewAdapter.kt:121) 在 androidx.compose.ui.tooling.ComposeViewAdapter$init$3.invoke(ComposeViewAdapter.kt:564) 在 androidx.compose.ui.tooling.ComposeViewAdapter$init$3.invoke(ComposeViewAdapter.kt:561) 在 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) 在 androidx.compose.ui.platform.AbstractComposeView$ensureCompositionCreated$1.invoke(ComposeView.android.kt:227) 在 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.ProvideAndroidCompositionLocals(AndroidCompositionLocals.android.kt:106) 在 androidx.compose.ui.platform.WrappedComposition$setContent$1$1$3.invoke(Wrapper.android.kt:162) 在 androidx.compose.ui.platform.WrappedComposition$setContent$1$1$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.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:215) 在 androidx.compose.ui.platform.WrappedComposition$setContent$1$1.invoke(Wrapper.android.kt:161) 在 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) 在 androidx.compose.runtime.ComposerKt.invokeComposable(Composer.kt:3336) 在 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.runtime.CompositionImpl.setContent(Composition.kt:432) 在 androidx.compose.ui.platform.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(生命周期注册表.java:354) 在 androidx.lifecycle.LifecycleRegistry.addObserver(生命周期注册表.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) at 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) 在 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3496) 在 android.view.AttachInfo_Accessor.setAttachInfo(AttachInfo_Accessor.java:44) 在 com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:360) 在 com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:431) 在 com.android.tools.idea.layoutlib.LayoutLibrary.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)
答:
在发布问题后,我们找到了解决方案。
只需在每个需要它的预览方法的开头添加以下行:
AndroidThreeTen.init(LocalContext.current)
如果有一种方法可以设置一种方法以调用所有预览版的设置,那就太好了,这可能是在即将到来的版本中希望的事情。
评论
AndroidThreeTen
评论