landscapist: Problem in preview

Lib Version : implementation "com.github.skydoves:landscapist-glide:1.3.9"

Testing Demo Code :

GlideImage(
        imageModel = R.drawable.ic_launcher_background,
        contentScale = ContentScale.Crop,
        modifier = Modifier.aspectRatio(1f),
        loading = {
            ConstraintLayout(modifier = Modifier.fillMaxSize()) {
                val indicator = createRef()
                CircularProgressIndicator(
                    modifier = Modifier
                        .aspectRatio(1f)
                        .constrainAs(indicator) {
                            top.linkTo(parent.top)
                            bottom.linkTo(parent.bottom)
                            start.linkTo(parent.start)
                            end.linkTo(parent.end)
                        }
                        .defaultMinSize(128.dp)
                )
            }
        },
        failure = {
            Text(text = "load failed!", )
        })

Error : Render Problem in Design

java.lang.IllegalStateException: You cannot call Glide.get() in registerComponents(), use the provided Glide instance instead   at com.bumptech.glide.Glide.checkAndInitializeGlide(Glide.java:205)   at com.bumptech.glide.Glide.get(Glide.java:191)   at com.bumptech.glide.Glide.getRetriever(Glide.java:774)   at com.bumptech.glide.Glide.with(Glide.java:801)   at com.skydoves.landscapist.glide.LocalGlideProvider.getGlideRequestManager(LocalGlideProvider.kt:75)   at com.skydoves.landscapist.glide.LocalGlideProvider.getGlideRequestBuilder(LocalGlideProvider.kt:63)   at com.skydoves.landscapist.glide.GlideImage__GlideImageKt.GlideImage(GlideImage.kt:369)   at com.skydoves.landscapist.glide.GlideImage.GlideImage(GlideImage.kt:1)   at com.ist.jetpackcompose.views.ComposeImageKt.GlideImageLoaderRounded(ComposeImage.kt:90)   at com.ist.jetpackcompose.ui.screen.list.GridActivityKt$GridItem$2.invoke(GridActivity.kt:123)   at com.ist.jetpackcompose.ui.screen.list.GridActivityKt$GridItem$2.invoke(GridActivity.kt:121)   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)   at androidx.compose.material.SurfaceKt$Surface$6.invoke(Surface.kt:267)   at androidx.compose.material.SurfaceKt$Surface$6.invoke(Surface.kt:254)   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)   at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:215)   at androidx.compose.material.SurfaceKt.Surface-F-jzlyU(Surface.kt:251)   at androidx.compose.material.SurfaceKt.Surface-9VG74zQ(Surface.kt:214)   at androidx.compose.material.CardKt.Card-9VG74zQ(Card.kt:126)   at com.ist.jetpackcompose.ui.screen.list.GridActivityKt.GridItem(GridActivity.kt:111)   at com.ist.jetpackcompose.ui.screen.list.GridActivityKt$GridActivityPreview$1$1$2$1$invoke$$inlined$items$1.invoke(LazyGrid.kt:240)   at com.ist.jetpackcompose.ui.screen.list.GridActivityKt$GridActivityPreview$1$1$2$1$invoke$$inlined$items$1.invoke(LazyGrid.kt:135)   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:135)   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)   at androidx.compose.foundation.lazy.LazyGridScopeImpl$items$1$1.invoke(LazyGrid.kt:235)   at androidx.compose.foundation.lazy.LazyGridScopeImpl$items$1$1.invoke(LazyGrid.kt:235)   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)   at androidx.compose.foundation.lazy.LazyGridKt$FixedLazyGrid$1$1.invoke(LazyGrid.kt:205)   at androidx.compose.foundation.lazy.LazyGridKt$FixedLazyGrid$1$1.invoke(LazyGrid.kt:196)   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:135)   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)   at androidx.compose.foundation.lazy.LazyListScopeImpl$items$1$1.invoke(LazyDsl.kt:200)   at androidx.compose.foundation.lazy.LazyListScopeImpl$items$1$1.invoke(LazyDsl.kt:200)   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)   at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:215)   at androidx.compose.runtime.saveable.SaveableStateHolderImpl.SaveableStateProvider(SaveableStateHolder.kt:84)   at androidx.compose.foundation.lazy.LazyListItemContentFactory$CachedItemContent$content$1.invoke(LazyListItemContentFactory.kt:113)   at androidx.compose.foundation.lazy.LazyListItemContentFactory$CachedItemContent$content$1.invoke(LazyListItemContentFactory.kt:107)   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)   at androidx.compose.ui.layout.SubcomposeLayoutState$subcompose$2$1$1.invoke(SubcomposeLayout.kt:241)   at androidx.compose.ui.layout.SubcomposeLayoutState$subcompose$2$1$1.invoke(SubcomposeLayout.kt:241)   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)   at androidx.compose.runtime.ComposerKt.invokeComposable(Composer.kt:3332)   at androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke(Composer.kt:2577)   at androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke(Composer.kt:2566)   at androidx.compose.runtime.SnapshotStateKt.observeDerivedStateRecalculations(SnapshotState.kt:540)   at androidx.compose.runtime.ComposerImpl.doCompose(Composer.kt:2566)   at androidx.compose.runtime.ComposerImpl.composeContent$runtime_release(Composer.kt:2517)   at androidx.compose.runtime.CompositionImpl.composeContent(Composition.kt:477)   at androidx.compose.runtime.Recomposer.composeInitial$runtime_release(Recomposer.kt:727)   at androidx.compose.runtime.ComposerImpl$CompositionContextImpl.composeInitial$runtime_release(Composer.kt:2982)   at androidx.compose.runtime.CompositionImpl.setContent(Composition.kt:433)   at androidx.compose.ui.layout.SubcomposeLayoutState.subcomposeInto(SubcomposeLayout.kt:259)   at androidx.compose.ui.layout.SubcomposeLayoutState.access$subcomposeInto(SubcomposeLayout.kt:145)   at androidx.compose.ui.layout.SubcomposeLayoutState$subcompose$2.invoke(SubcomposeLayout.kt:234)   at androidx.compose.ui.layout.SubcomposeLayoutState$subcompose$2.invoke(SubcomposeLayout.kt:231)   at androidx.compose.runtime.snapshots.SnapshotStateObserver.withNoObservations(SnapshotStateObserver.kt:144)   at androidx.compose.ui.node.OwnerSnapshotObserver.withNoSnapshotReadObservation$ui_release(OwnerSnapshotObserver.kt:49)   at androidx.compose.ui.node.LayoutNode.withNoSnapshotReadObservation$ui_release(LayoutNode.kt:1107)   at androidx.compose.ui.layout.SubcomposeLayoutState.subcompose(SubcomposeLayout.kt:231)   at androidx.compose.ui.layout.SubcomposeLayoutState.subcompose(SubcomposeLayout.kt:226)   at androidx.compose.ui.layout.SubcomposeLayoutState.subcompose$ui_release(SubcomposeLayout.kt:215)   at androidx.compose.ui.layout.SubcomposeLayoutState$Scope.subcompose(SubcomposeLayout.kt:466)   at androidx.compose.foundation.lazy.LazyMeasuredItemProvider.getAndMeasure-ZjPyQlc(LazyMeasuredItemProvider.kt:48)   at androidx.compose.foundation.lazy.LazyListMeasureKt.measureLazyList-9CW8viI(LazyListMeasure.kt:145)   at androidx.compose.foundation.lazy.LazyListKt$LazyList$1.invoke-0kLqBqw(LazyList.kt:152)   at androidx.compose.foundation.lazy.LazyListKt$LazyList$1.invoke(LazyList.kt:76)   at androidx.compose.ui.layout.SubcomposeLayoutState$createMeasurePolicy$1.measure-3p2s80s(SubcomposeLayout.kt:345)   at androidx.compose.ui.node.InnerPlaceable.measure-BRTryo0(InnerPlaceable.kt:43)   at androidx.compose.foundation.layout.PaddingValuesModifier.measure-3p2s80s(Padding.kt:417)   at androidx.compose.ui.node.ModifiedLayoutNode.measure-BRTryo0(ModifiedLayoutNode.kt:39)   at androidx.compose.ui.graphics.SimpleGraphicsLayerModifier.measure-3p2s80s(GraphicsLayerModifier.kt:219)   at androidx.compose.ui.node.ModifiedLayoutNode.measure-BRTryo0(ModifiedLayoutNode.kt:39)   at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.kt:116)   at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.kt:116)   at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.kt:116)   at androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$3.invoke(OuterMeasurablePlaceable.kt:100)   at androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$3.invoke(OuterMeasurablePlaceable.kt:99)   at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:128)   at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:75)   at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release(OwnerSnapshotObserver.kt:63)   at androidx.compose.ui.node.OuterMeasurablePlaceable.remeasure-BRTryo0(OuterMeasurablePlaceable.kt:99)   at androidx.compose.ui.node.OuterMeasurablePlaceable.measure-BRTryo0(OuterMeasurablePlaceable.kt:71)   at androidx.compose.ui.node.LayoutNode.measure-BRTryo0(LayoutNode.kt:1227)   at androidx.compose.foundation.layout.RowColumnImplKt$rowColumnMeasurePolicy$1.measure-3p2s80s(RowColumnImpl.kt:89)   at androidx.compose.ui.node.InnerPlaceable.measure-BRTryo0(InnerPlaceable.kt:43)   at androidx.compose.foundation.layout.FillModifier.measure-3p2s80s(Size.kt:627)   at androidx.compose.ui.node.ModifiedLayoutNode.measure-BRTryo0(ModifiedLayoutNode.kt:39)   at androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$3.invoke(OuterMeasurablePlaceable.kt:100)   at androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$3.invoke(OuterMeasurablePlaceable.kt:99)   at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:128)   at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:75)   at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release(OwnerSnapshotObserver.kt:63)   at androidx.compose.ui.node.OuterMeasurablePlaceable.remeasure-BRTryo0(OuterMeasurablePlaceable.kt:99)   at androidx.compose.ui.node.OuterMeasurablePlaceable.measure-BRTryo0(OuterMeasurablePlaceable.kt:71)   at androidx.compose.ui.node.LayoutNode.measure-BRTryo0(LayoutNode.kt:1227)   at androidx.compose.foundation.layout.RowColumnImplKt$rowColumnMeasurePolicy$1.measure-3p2s80s(RowColumnImpl.kt:89)   at androidx.compose.ui.node.InnerPlaceable.measure-BRTryo0(InnerPlaceable.kt:43)   at androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$3.invoke(OuterMeasurablePlaceable.kt:100)   at androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$3.invoke(OuterMeasurablePlaceable.kt:99)   at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:128)   at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:75)   at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release(OwnerSnapshotObserver.kt:63)   at androidx.compose.ui.node.OuterMeasurablePlaceable.remeasure-BRTryo0(OuterMeasurablePlaceable.kt:99)   at androidx.compose.ui.node.OuterMeasurablePlaceable.measure-BRTryo0(OuterMeasurablePlaceable.kt:71)   at androidx.compose.ui.node.LayoutNode.measure-BRTryo0(LayoutNode.kt:1227)   at androidx.compose.ui.layout.RootMeasurePolicy.measure-3p2s80s(RootMeasurePolicy.kt:38)   at androidx.compose.ui.node.InnerPlaceable.measure-BRTryo0(InnerPlaceable.kt:43)   at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.kt:116)   at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.kt:116)   at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.kt:116)   at androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$3.invoke(OuterMeasurablePlaceable.kt:100)   at androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$3.invoke(OuterMeasurablePlaceable.kt:99)   at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:1776)   at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:123)   at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:75)   at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release(OwnerSnapshotObserver.kt:63)   at androidx.compose.ui.node.OuterMeasurablePlaceable.remeasure-BRTryo0(OuterMeasurablePlaceable.kt:99)   at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui_release(LayoutNode.kt:1236)   at androidx.compose.ui.node.MeasureAndLayoutDelegate.doRemeasure-0kLqBqw(MeasureAndLayoutDelegate.kt:169)   at androidx.compose.ui.node.MeasureAndLayoutDelegate.access$doRemeasure-0kLqBqw(MeasureAndLayoutDelegate.kt:38)   at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:207)   at androidx.compose.ui.platform.AndroidComposeView.onMeasure_Original(AndroidComposeView.android.kt:547)   at androidx.compose.ui.platform.AndroidComposeView.onMeasure(AndroidComposeView.android.kt:-1)   at android.view.View.measure_Original(View.java:25466)   at android.view.View_Delegate.measure(View_Delegate.java:80)   at android.view.View.measure(View.java:25430)   at androidx.compose.ui.platform.AbstractComposeView.internalOnMeasure$ui_release(ComposeView.android.kt:278)   at androidx.compose.ui.platform.AbstractComposeView.onMeasure_Original(ComposeView.android.kt:265)   at androidx.compose.ui.platform.AbstractComposeView.onMeasure(ComposeView.android.kt:-1)   at android.view.View.measure_Original(View.java:25466)   at android.view.View_Delegate.measure(View_Delegate.java:80)   at android.view.View.measure(View.java:25430)   at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)   at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)   at android.view.View.measure_Original(View.java:25466)   at android.view.View_Delegate.measure(View_Delegate.java:80)   at android.view.View.measure(View.java:25430)   at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)   at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)   at android.view.View.measure_Original(View.java:25466)   at android.view.View_Delegate.measure(View_Delegate.java:80)   at android.view.View.measure(View.java:25430)   at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:735)   at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:481)   at android.view.View.measure_Original(View.java:25466)   at android.view.View_Delegate.measure(View_Delegate.java:80)   at android.view.View.measure(View.java:25430)   at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)   at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)   at android.view.View.measure_Original(View.java:25466)   at android.view.View_Delegate.measure(View_Delegate.java:80)   at android.view.View.measure(View.java:25430)

About this issue

  • Original URL
  • State: closed
  • Created 3 years ago
  • Comments: 18 (9 by maintainers)

Most upvoted comments

Hey @androidapkr, in the new stable 1.4.0, we can resolve this issue like the below. A new parameter previewPlaceHolder has been added. 😃

 GlideImage(
          imageModel = R.drawable.ic_launcher_background,
          contentScale = ContentScale.Crop,
          modifier = Modifier.aspectRatio(1f),
          previewPlaceHolder = R.drawable.placeholder,

Hi @skydoves - yes I can build it. Preview does work.

However, the previews in MainPosters.kt do not use a GlideImage. When I replace the FrescoImage in the HomePoster() composable with a GlideImage, preview crashes with the same issue:

https://github.com/nosyjoe/Landscapist/commit/7f6e6d5ebfa72ba438089d79e6241ab207bedc6a

Hope this helps!

@skydoves it does work well. Both preview and in an app. Thanks for the quick fix!

I tried a solution that solves it for me, allows the preview to render and the app to run, with minimal changes: I changed the requestBuilder parameter type from RequestBuilder<Drawable> to @Composable () -> RequestBuilder<Drawable> so that the default parameter value is not evaluated immediately.

Here’s the diff: https://github.com/nosyjoe/Landscapist/commit/899a0b8c3f4db061e0b875a591daf89928881749

What do you think?

@skydoves thanks for the update. Unfortunately, using version 1.4.1, I’m still getting the crash that the @androidapkr has initially reported . And unfortunately no image 😦

Even when specifying a previewPlaceHolder, a Glide / RequestBuilder instance is being constructed by the default parameter value:

https://github.com/skydoves/Landscapist/blob/09a79ed8d031db98895c835691308dc54db3b527/glide/src/main/java/com/skydoves/landscapist/glide/GlideImage.kt#L398

Anything we can do here?

That’s a great alternative one! If I find a nicer solution, I will share it on this thread.

@skydoves thank you guiding PreviewParameterProvider

There is same library for Glide on compose implementation "com.google.accompanist:accompanist-glide:0.10.0" but it has same issue that i mentioned earlier. So rather to stuck on issue of Preview by Android studio, i move with below solutions, and waiting for Android studio and Glide update for this.

I make some changes in code for preview and debug/run, i make condition to whether data is display for preview and debug/run into device.

To display preview correctly, have to use below method

if(isPreview) {
  Image(
              painter = painterResource(R.drawable.ic_launcher_background),
              contentDescription = "Descriptions",
              modifier = Modifier.aspectRatio(1f),
              contentScale = ContentScale.Crop
          )
} else {
  GlideImage(
          imageModel = R.drawable.ic_launcher_background,
          contentScale = ContentScale.Crop,
          modifier = Modifier.aspectRatio(1f),
          loading = {
              ConstraintLayout(modifier = Modifier.fillMaxSize()) {
                  val indicator = createRef()
                  CircularProgressIndicator(
                      modifier = Modifier
                          .aspectRatio(1f)
                          .constrainAs(indicator) {
                              top.linkTo(parent.top)
                              bottom.linkTo(parent.bottom)
                              start.linkTo(parent.start)
                              end.linkTo(parent.end)
                          }
                          .defaultMinSize(128.dp)
                  )
              }
          },
          failure = {
              Text(text = "load failed!", )
          })
}

This is trick but it can save much time to suck in Preview Mode in Comose. Hope this can help.

I’m not sure but I guess we can resolve this issue using the PreviewParameterProvider.