refactor: Improve key generation for list items

This commit is contained in:
Cuong-Tran 2024-06-25 12:48:12 +07:00
parent 05565900db
commit 11cfa733e9
20 changed files with 42 additions and 34 deletions

View file

@ -221,7 +221,7 @@ private fun ExtensionDetails(
items(
items = sources,
key = { it.source.id },
key = { "extension-details-${it.source.id}" },
) { source ->
SourceSwitchPreference(
modifier = Modifier.animateItemPlacement(),

View file

@ -104,7 +104,7 @@ fun FeedScreen(
) {
items(
state.items.orEmpty(),
key = { it.feed.id },
key = { "feed-${it.feed.id}" },
) { item ->
GlobalSearchResultItem(
modifier = Modifier.animateItemPlacement(),

View file

@ -119,7 +119,7 @@ internal fun GlobalSearchContent(
contentPadding = contentPadding,
) {
items.forEach { (source, result) ->
item(key = source.id) {
item(key = "global-search-${source.id}") {
// KMK -->
val domainSource = DomainSource(
source.id,

View file

@ -10,7 +10,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.outlined.ArrowForward
import androidx.compose.material.icons.outlined.ArrowForward
import androidx.compose.material.icons.outlined.ContentCopy
import androidx.compose.material.icons.outlined.CopyAll
import androidx.compose.material.icons.outlined.Done
@ -91,7 +90,7 @@ fun MigrationListScreen(
ScrollbarLazyColumn(
contentPadding = contentPadding + topSmallPaddingValues,
) {
items(items, key = { it.manga.id }) { migrationItem ->
items(items, key = { "migration-list-${it.manga.id}" }) { migrationItem ->
Row(
Modifier
.fillMaxWidth()

View file

@ -205,7 +205,7 @@ fun SourceFeedList(
) {
items(
items,
key = { it.id },
key = { "source-feed-${it.id}" },
) { item ->
GlobalSearchResultItem(
modifier = Modifier.animateItemPlacement(),

View file

@ -131,7 +131,7 @@ fun SourcesScreen(
},
key = {
when (it) {
is SourceUiModel.Header -> it.hashCode()
is SourceUiModel.Header -> "header-${it.hashCode()}"
is SourceUiModel.Item -> "source-${it.source.key()}"
}
},

View file

@ -47,7 +47,7 @@ fun RelatedMangasComfortableGrid(
relatedMangas.forEach { related ->
val isLoading = related is RelatedManga.Loading
if (isLoading) {
header(key = "$related#header") {
header(key = "${related.hashCode()}#header") {
RelatedMangaTitle(
title = stringResource(MR.strings.loading),
subtitle = null,
@ -56,11 +56,11 @@ fun RelatedMangasComfortableGrid(
modifier = Modifier.background(MaterialTheme.colorScheme.background),
)
}
header(key = "$related#content") { RelatedMangasLoadingItem() }
header(key = "${related.hashCode()}#content") { RelatedMangasLoadingItem() }
} else {
val relatedManga = related as RelatedManga.Success
header(key = "${related.keyword}#divider") { HorizontalDivider() }
header(key = "${related.keyword}#header") {
header(key = "${related.hashCode()}#divider") { HorizontalDivider() }
header(key = "${related.hashCode()}#header") {
RelatedMangaTitle(
title = if (relatedManga.keyword.isNotBlank()) {
stringResource(KMR.strings.related_mangas_more)
@ -77,7 +77,10 @@ fun RelatedMangasComfortableGrid(
modifier = Modifier.background(MaterialTheme.colorScheme.background),
)
}
items(key = { relatedManga.mangaList[it].id }, count = relatedManga.mangaList.size) { index ->
items(
key = { "related-comfort-${relatedManga.mangaList[it].id}" },
count = relatedManga.mangaList.size,
) { index ->
val manga by getManga(relatedManga.mangaList[index])
BrowseSourceComfortableGridItem(
manga = manga,

View file

@ -47,7 +47,7 @@ fun RelatedMangasCompactGrid(
relatedMangas.forEach { related ->
val isLoading = related is RelatedManga.Loading
if (isLoading) {
header(key = "$related#header") {
header(key = "${related.hashCode()}#header") {
RelatedMangaTitle(
title = stringResource(MR.strings.loading),
subtitle = null,
@ -56,11 +56,11 @@ fun RelatedMangasCompactGrid(
modifier = Modifier.background(MaterialTheme.colorScheme.background),
)
}
header(key = "$related#content") { RelatedMangasLoadingItem() }
header(key = "${related.hashCode()}#content") { RelatedMangasLoadingItem() }
} else {
val relatedManga = related as RelatedManga.Success
header(key = "${related.keyword}#divider") { HorizontalDivider() }
header(key = "${related.keyword}#header") {
header(key = "${related.hashCode()}#divider") { HorizontalDivider() }
header(key = "${related.hashCode()}#header") {
RelatedMangaTitle(
title = if (relatedManga.keyword.isNotBlank()) {
stringResource(KMR.strings.related_mangas_more)
@ -77,7 +77,10 @@ fun RelatedMangasCompactGrid(
modifier = Modifier.background(MaterialTheme.colorScheme.background),
)
}
items(key = { relatedManga.mangaList[it].id }, count = relatedManga.mangaList.size) { index ->
items(
key = { "related-compact-${relatedManga.mangaList[it].id}" },
count = relatedManga.mangaList.size,
) { index ->
val manga by getManga(relatedManga.mangaList[index])
BrowseSourceCompactGridItem(
manga = manga,

View file

@ -39,8 +39,8 @@ fun RelatedMangasList(
relatedMangas.forEach { related ->
val isLoading = related is RelatedManga.Loading
if (isLoading) {
item(key = "$related#divider") { HorizontalDivider() }
stickyHeader(key = "$STICKY_HEADER_KEY_PREFIX$related#header") {
item(key = "${related.hashCode()}#divider") { HorizontalDivider() }
stickyHeader(key = "$STICKY_HEADER_KEY_PREFIX${related.hashCode()}#header") {
RelatedMangaTitle(
title = stringResource(MR.strings.loading),
subtitle = null,
@ -54,11 +54,11 @@ fun RelatedMangasList(
.background(MaterialTheme.colorScheme.background),
)
}
item(key = "$related#content") { RelatedMangasLoadingItem() }
item(key = "${related.hashCode()}#content") { RelatedMangasLoadingItem() }
} else {
val relatedManga = related as RelatedManga.Success
item(key = "${related.keyword}#divider") { HorizontalDivider() }
stickyHeader(key = "$STICKY_HEADER_KEY_PREFIX${related.keyword}#header") {
item(key = "${related.hashCode()}#divider") { HorizontalDivider() }
stickyHeader(key = "$STICKY_HEADER_KEY_PREFIX${related.hashCode()}#header") {
RelatedMangaTitle(
title = if (relatedManga.keyword.isNotBlank()) {
stringResource(KMR.strings.related_mangas_more)
@ -80,7 +80,10 @@ fun RelatedMangasList(
.background(MaterialTheme.colorScheme.background),
)
}
items(key = { relatedManga.mangaList[it].id }, count = relatedManga.mangaList.size) { index ->
items(
key = { "related-list-${relatedManga.mangaList[it].id}" },
count = relatedManga.mangaList.size,
) { index ->
val manga by getManga(relatedManga.mangaList[index])
BrowseSourceListItem(
manga = manga,

View file

@ -24,7 +24,7 @@ fun BiometricTimesContent(
contentPadding = paddingValues,
verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small),
) {
items(timeRanges, key = { it.formattedString }) { timeRange ->
items(timeRanges, key = { "biometric-${it.formattedString}" }) { timeRange ->
BiometricTimesListItem(
modifier = Modifier.animateItemPlacement(),
timeRange = timeRange,

View file

@ -25,7 +25,7 @@ fun SortTagContent(
contentPadding = paddingValues,
verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small),
) {
itemsIndexed(tags, key = { _, tag -> tag }) { index, tag ->
itemsIndexed(tags, key = { _, tag -> "sort-tag-$tag" }) { index, tag ->
SortTagListItem(
modifier = Modifier.animateItemPlacement(),
tag = tag,

View file

@ -24,7 +24,7 @@ fun SourceCategoryContent(
contentPadding = paddingValues,
verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small),
) {
items(categories, key = { it }) { category ->
items(categories, key = { "source-category-$it" }) { category ->
SourceCategoryListItem(
modifier = Modifier.animateItemPlacement(),
category = category,

View file

@ -147,7 +147,7 @@ fun LazyListScope.PagePreviewItems(
pagePreviewState is PagePreviewState.Success -> {
val itemPerRowCount = (maxWidth / 120.dp).floor()
items(
key = { "${MangaScreenItem.CHAPTER_PREVIEW_ROW}-$it" },
key = { "${MangaScreenItem.CHAPTER_PREVIEW_ROW}-${it.hashCode()}" },
contentType = { MangaScreenItem.CHAPTER_PREVIEW_ROW },
items = pagePreviewState.pagePreviews.take(rowCount * itemPerRowCount).chunked(itemPerRowCount),
) {

View file

@ -64,7 +64,7 @@ fun RelatedMangaCardRow(
contentPadding = PaddingValues(MaterialTheme.padding.small),
horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall),
) {
items(mangas, key = { it.id }) {
items(mangas, key = { "related-row-${it.id}" }) {
val manga by getManga(it)
MangaItem(
title = manga.title,

View file

@ -133,7 +133,7 @@ object SettingsMainScreen : Screen() {
) {
itemsIndexed(
items = items,
key = { _, item -> item.hashCode() },
key = { _, item -> "settings-main-${item.hashCode()}" },
) { index, item ->
val selected = indexSelected == index
var modifier: Modifier = Modifier

View file

@ -232,7 +232,7 @@ private fun SearchResult(
) {
items(
items = it,
key = { i -> i.hashCode() },
key = { i -> "settings-search-${i.hashCode()}" },
) { item ->
Column(
modifier = Modifier

View file

@ -90,7 +90,7 @@ private fun AppThemesList(
) {
items(
items = appThemes,
key = { it.name },
key = { "theme-${it.name}" },
) { appTheme ->
Column(
modifier = Modifier

View file

@ -50,7 +50,7 @@ fun ChapterListDialog(
) {
items(
items = chapters,
key = { "chapter-${it.chapter.id}" },
key = { "chapter-list-${it.chapter.id}" },
) { chapterItem ->
MangaChapterListItem(
title = chapterItem.chapter.name,

View file

@ -195,7 +195,7 @@ fun TrackerSearch(
) {
items(
items = availableTracks,
key = { it.hashCode() },
key = { "tracker-search-${it.hashCode()}" },
) {
SearchResultItem(
trackSearch = it,

View file

@ -125,7 +125,7 @@ class BatchAddScreen : Screen() {
}
itemsIndexed(
state.events,
key = { index, text -> index + text.hashCode() },
key = { index, text -> "batch-add-${index + text.hashCode()}" },
) { _, text ->
Text(
text = text,