IndexOutOfBoundsException в AdapterList - PullRequest
0 голосов
/ 05 марта 2020

Я попытался организовать работу с динамическими данными c в недавно представленном компоненте AdapterList. В качестве теста я поместил список данных в состояние родительского компонента и добавил кнопку, которая уменьшит длину исходного списка на единицу при каждом нажатии.

val (data, setData) = state { testFilms }

Column {
    Button(onClick = {
        setData(testFilms.dropLast(1))
    }) {
        Text("Change")
    }

    AdapterList(
        data,
        modifier = LayoutPadding(5.dp) + LayoutHeight.Fill + LayoutWidth.Fill
    ) { film ->
        FilmItemView(
            film = film,
            selectFilmAction = selectFilmAction,
            logger = logger
        )
    }
}

Но вместо ожидаемого результата , Я получил следующую ошибку при перекомпоновке AdapterList:

java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
    at java.util.ArrayList.get(ArrayList.java:437)
    at androidx.ui.foundation.ListState$composeChildForDataIndex$3$1.invoke(AdapterList.kt:448)
    at androidx.ui.foundation.ListState$composeChildForDataIndex$3$1.invoke(Unknown Source:0)
    at androidx.compose.ObserveKt.Observe(Observe.kt:37)
    at androidx.ui.foundation.ListState$composeChildForDataIndex$3.invoke(Unknown Source:11)
    at androidx.ui.foundation.ListState$composeChildForDataIndex$3.invoke(Unknown Source:0)
    at androidx.compose.Recomposer$recompose$1.invoke(Recomposer.kt:61)
    at androidx.compose.Recomposer$recompose$1.invoke(Recomposer.kt:19)
    at androidx.compose.ViewComposerKt.runWithCurrent(ViewComposer.kt:387)
    at androidx.compose.Recomposer.recompose(Recomposer.kt:51)
    at androidx.compose.Recomposer.access$recompose(Recomposer.kt:19)
    at androidx.compose.Recomposer$Companion.recompose$compose_runtime_release(Recomposer.kt:42)
    at androidx.compose.Composition.compose(Composition.kt:67)
    at androidx.compose.Composition.compose(Composition.kt:59)
    at androidx.compose.Compose$subcomposeInto$1.invoke(Compose.kt:253)
    at androidx.compose.Compose$subcomposeInto$1.invoke(Compose.kt:23)
    at androidx.compose.ViewComposerKt.runWithComposing(ViewComposer.kt:397)
    at androidx.compose.Compose.subcomposeInto(Compose.kt:252)
    at androidx.ui.foundation.ListState.composeChildForDataIndex-N7Qnm20(AdapterList.kt:447)
    at androidx.ui.foundation.ListState.recomposeAllChildren(AdapterList.kt:358)
    at androidx.ui.foundation.ListState.recomposeIfAttached(AdapterList.kt:352)
    at androidx.ui.foundation.AdapterListKt.AdapterList(AdapterList.kt:486)
    at com.gitlab.andrewkuryan.lab1.view.FilmListViewKt$FilmList$1$2$invoke$1.invoke(FilmListView.kt:174)
    at com.gitlab.andrewkuryan.lab1.view.FilmListViewKt$FilmList$1$2$invoke$1.invoke(Unknown Source:0)
    at androidx.compose.ObserveKt.Observe(Observe.kt:37)
    at com.gitlab.andrewkuryan.lab1.view.FilmListViewKt$FilmList$1$2.invoke(Unknown Source:20)
    at com.gitlab.andrewkuryan.lab1.view.FilmListViewKt$FilmList$1$2.invoke(Unknown Source:3)

Кто-нибудь знает какие-либо способы работы с данными Dynami c с этим компонентом?

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Это ошибка ( выпуск 153195921 ), и она будет исправлена ​​в следующем выпуске этим патчем .

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

0 голосов
/ 11 марта 2020

Если вы знакомы с dev06 Jetpack Compose , у вас есть два способа сделать это:

  • Ваш List<Any> должен быть «осведомлен о создании» и текущий для этого доступно ModelList<Any>
  • Вы можете создать модель, используя тег @Model, так как они изменяют состояние, и ваша функция @Compososable будет знать (используя MutableList)

Пример кода:

fun addLogic(modelList: ModelList<MyModel>) {
  modelList.add(MyModel("Smith John", 10))
}

class MyModel(var name: String, var index: Int)

@Composable
fun RecycledList() { // Any name you want
  val modelList<MyModel> = modelListOf()
  var counter = 0

  addLogic(modelList)

  modelList.add(MyModel("John Doe", 99))

  MaterialTheme {
    Column {
      Container(height = 70.dp) {
         Align(alignment = Alignment.Center) {
            Button(onClick = { 
               modelList.add(MyModel("John Smith", counter++))
               // Any other logic you want
            }) {
               Text("ADD ITEM")
            }
         }
      }
      AdapterList(data = modelList) { item ->
         Center {
            Text("Hello ${item.name} - Index: ${item.index}")
         }
      },
    }
  }
}

Результат:

AdapterList

Во время тестирования AdapterList я заметил IndexOutOfBoundsException при удалении значений, но никаких проблем при добавлении. Я обновлю свой ответ, когда получу этот ответ.

...