refactor: Improve key generation for list items
This commit is contained in:
parent
05565900db
commit
11cfa733e9
20 changed files with 42 additions and 34 deletions
|
|
@ -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(),
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@ fun FeedScreen(
|
|||
) {
|
||||
items(
|
||||
state.items.orEmpty(),
|
||||
key = { it.feed.id },
|
||||
key = { "feed-${it.feed.id}" },
|
||||
) { item ->
|
||||
GlobalSearchResultItem(
|
||||
modifier = Modifier.animateItemPlacement(),
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -205,7 +205,7 @@ fun SourceFeedList(
|
|||
) {
|
||||
items(
|
||||
items,
|
||||
key = { it.id },
|
||||
key = { "source-feed-${it.id}" },
|
||||
) { item ->
|
||||
GlobalSearchResultItem(
|
||||
modifier = Modifier.animateItemPlacement(),
|
||||
|
|
|
|||
|
|
@ -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()}"
|
||||
}
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
) {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -232,7 +232,7 @@ private fun SearchResult(
|
|||
) {
|
||||
items(
|
||||
items = it,
|
||||
key = { i -> i.hashCode() },
|
||||
key = { i -> "settings-search-${i.hashCode()}" },
|
||||
) { item ->
|
||||
Column(
|
||||
modifier = Modifier
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ private fun AppThemesList(
|
|||
) {
|
||||
items(
|
||||
items = appThemes,
|
||||
key = { it.name },
|
||||
key = { "theme-${it.name}" },
|
||||
) { appTheme ->
|
||||
Column(
|
||||
modifier = Modifier
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -195,7 +195,7 @@ fun TrackerSearch(
|
|||
) {
|
||||
items(
|
||||
items = availableTracks,
|
||||
key = { it.hashCode() },
|
||||
key = { "tracker-search-${it.hashCode()}" },
|
||||
) {
|
||||
SearchResultItem(
|
||||
trackSearch = it,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in a new issue