Android Составить данные обновления списка адаптеров асинхронно - PullRequest
6 голосов
/ 07 мая 2020

Привет, я пытаюсь асинхронно обновить составной элемент AdapterList. Я поместил изображение как один из пунктов списка. Данные изображения загружаются с сервера с помощью сопрограммы и обновляют значение с помощью состояния. Когда я бросаю элементы списка, появляется следующая ошибка

    java.lang.IllegalStateException: Asking for measurement result of unmeasured layout modifier
        at androidx.ui.core.LayoutNodeWrapper.getMeasureResult(LayoutNodeWrapper.kt:58)
        at androidx.ui.core.LayoutNodeWrapper.getMeasuredSize(LayoutNodeWrapper.kt:48)
        at androidx.ui.core.Placeable.getWidth(Placeable.kt:40)
        at androidx.ui.core.LayoutNode.getWidth(ComponentNodes.kt:841)
        at androidx.ui.foundation.ListState.composeAndMeasureNextItem-BTEqjtU(AdapterList.kt:222)
        at androidx.ui.foundation.ListState.consumePendingScroll(AdapterList.kt:151)
        at androidx.ui.foundation.ListState.access$consumePendingScroll$3(Unknown Source:0)
        at androidx.ui.foundation.ListState$ListMeasureBlocks.measure(AdapterList.kt:277)
        at androidx.ui.core.InnerPlaceable.performMeasure(InnerPlaceable.kt:43)
        at androidx.ui.core.LayoutNodeWrapper.measure(LayoutNodeWrapper.kt:99)
        at androidx.ui.core.DelegatingLayoutNodeWrapper.performMeasure(DelegatingLayoutNodeWrapper.kt:79)
        at androidx.ui.core.LayerWrapper.performMeasure(LayerWrapper.kt:52)
        at androidx.ui.core.LayoutNodeWrapper.measure(LayoutNodeWrapper.kt:99)
        at androidx.ui.core.DelegatingLayoutNodeWrapper.performMeasure(DelegatingLayoutNodeWrapper.kt:79)
        at androidx.ui.core.LayoutNodeWrapper.measure(LayoutNodeWrapper.kt:99)
        at androidx.ui.core.DelegatingLayoutNodeWrapper.performMeasure(DelegatingLayoutNodeWrapper.kt:79)
        at androidx.ui.core.LayoutNodeWrapper.measure(LayoutNodeWrapper.kt:99)
        at androidx.ui.core.DelegatingLayoutNodeWrapper.performMeasure(DelegatingLayoutNodeWrapper.kt:79)
        at androidx.ui.core.LayoutNodeWrapper.measure(LayoutNodeWrapper.kt:99)
        at androidx.ui.core.LayoutNode$measure$2.invoke(ComponentNodes.kt:1177)
        at androidx.ui.core.LayoutNode$measure$2.invoke(Unknown Source:0)
        at androidx.ui.core.ModelObserver.observeReads(ModelObserver.kt:151)
        at androidx.ui.core.AndroidComposeView.observeMeasureModelReads(AndroidOwner.kt:487)
        at androidx.ui.core.LayoutNode.measure(ComponentNodes.kt:1176)

Ответы [ 2 ]

3 голосов
/ 09 мая 2020

Я сам видел это несколько раз, когда оба списка загружали изображения, как вы описываете, а также списки без какой-либо асинхронной работы. . У меня сложилось впечатление, что это просто ошибка с текущим состоянием Compose.

При этом AndroidComposeViewAccessibilityDelegateCompat - это по крайней мере один класс, который обрабатывает эту ошибку и ссылается на внутренний билет системы отслеживания проблем, который указывает он будет исправлен в Android R, по крайней мере, для этого экземпляра.

} catch (e: IllegalStateException) {
    // We may get "Asking for measurement result of unmeasured layout modifier" error.
    // TODO(b/153198816): check whether we still get this exception when R is in.
    info.setBoundsInScreen(android.graphics.Rect())
}

Также есть предстоящее изменение в dev11, которое обновляет AdapterList для удаления композиций, прокрученных с экрана , и мне любопытно посмотреть, как это влияет на вещи.

И если вам просто интересно, где возникает ошибка, вы можете проверить LayoutNodeWrapper._measureResult .

0 голосов
/ 27 июня 2020

Эта проблема исправлена ​​в версии Compose 0.1.0-dev14

Вы можете обновить свои зависимости Compose до

 composeOptions {
    kotlinCompilerExtensionVersion '0.1.0-dev14'
    kotlinCompilerVersion '1.3.70-dev-withExperimentalGoogleExtensions-20200424'
}
...