mirror of
https://github.com/affaan-m/everything-claude-code.git
synced 2026-04-17 23:53:30 +08:00
fix: address PR review comments for Kotlin/Android/KMP docs
This commit is contained in:
@@ -81,7 +81,8 @@ data class Item(
|
||||
val title: String,
|
||||
val description: String,
|
||||
val tags: List<String>,
|
||||
val status: Status
|
||||
val status: Status,
|
||||
val category: String
|
||||
)
|
||||
|
||||
enum class Status { DRAFT, ACTIVE, ARCHIVED }
|
||||
@@ -119,6 +120,12 @@ class ItemRepositoryImpl(
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun saveItem(item: Item): Result<Unit> {
|
||||
return runCatching {
|
||||
localDataSource.insertItems(listOf(item.toEntity()))
|
||||
}
|
||||
}
|
||||
|
||||
override fun observeItems(): Flow<List<Item>> {
|
||||
return localDataSource.observeAll().map { entities ->
|
||||
entities.map { it.toDomain() }
|
||||
@@ -138,7 +145,8 @@ fun ItemEntity.toDomain() = Item(
|
||||
title = title,
|
||||
description = description,
|
||||
tags = tags.split("|"),
|
||||
status = Status.valueOf(status)
|
||||
status = Status.valueOf(status),
|
||||
category = category
|
||||
)
|
||||
|
||||
fun ItemDto.toEntity() = ItemEntity(
|
||||
@@ -146,7 +154,8 @@ fun ItemDto.toEntity() = ItemEntity(
|
||||
title = title,
|
||||
description = description,
|
||||
tags = tags.joinToString("|"),
|
||||
status = status
|
||||
status = status,
|
||||
category = category
|
||||
)
|
||||
```
|
||||
|
||||
@@ -159,7 +168,8 @@ data class ItemEntity(
|
||||
val title: String,
|
||||
val description: String,
|
||||
val tags: String,
|
||||
val status: String
|
||||
val status: String,
|
||||
val category: String
|
||||
)
|
||||
|
||||
@Dao
|
||||
@@ -184,15 +194,16 @@ CREATE TABLE ItemEntity (
|
||||
title TEXT NOT NULL,
|
||||
description TEXT NOT NULL,
|
||||
tags TEXT NOT NULL,
|
||||
status TEXT NOT NULL
|
||||
status TEXT NOT NULL,
|
||||
category TEXT NOT NULL
|
||||
);
|
||||
|
||||
getByCategory:
|
||||
SELECT * FROM ItemEntity WHERE category = ?;
|
||||
|
||||
upsert:
|
||||
INSERT OR REPLACE INTO ItemEntity (id, title, description, tags, status)
|
||||
VALUES (?, ?, ?, ?, ?);
|
||||
INSERT OR REPLACE INTO ItemEntity (id, title, description, tags, status, category)
|
||||
VALUES (?, ?, ?, ?, ?, ?);
|
||||
|
||||
observeAll:
|
||||
SELECT * FROM ItemEntity;
|
||||
|
||||
@@ -91,7 +91,7 @@ fun onEvent(event: ItemListEvent) {
|
||||
when (event) {
|
||||
is ItemListEvent.Search -> onSearch(event.query)
|
||||
is ItemListEvent.Delete -> deleteItem(event.itemId)
|
||||
is ItemListEvent.Refresh -> loadItems()
|
||||
is ItemListEvent.Refresh -> loadItems(_state.value.searchQuery)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -252,9 +252,12 @@ val showScrollToTop by remember {
|
||||
// BAD — new lambda and list every recomposition
|
||||
items.filter { it.isActive }.forEach { ActiveItem(it, onClick = { handle(it) }) }
|
||||
|
||||
// GOOD — remember filtered list, use method reference or remembered lambda
|
||||
// GOOD — remember filtered list, stable lambda with key
|
||||
val activeItems = remember(items) { items.filter { it.isActive } }
|
||||
activeItems.forEach { ActiveItem(it, onClick = remember { { handle(it) } }) }
|
||||
activeItems.forEach { item ->
|
||||
val onClick = remember(item.id) { { handle(item) } }
|
||||
ActiveItem(item, onClick = onClick)
|
||||
}
|
||||
```
|
||||
|
||||
## Theming
|
||||
|
||||
@@ -125,8 +125,13 @@ searchQuery
|
||||
|
||||
// Retry with exponential backoff
|
||||
fun fetchWithRetry(): Flow<Data> = flow { emit(api.fetch()) }
|
||||
.retry(3) { cause ->
|
||||
cause is IOException && run { delay(1000L * (1 shl (3 - remainingAttempts))) ; true }
|
||||
.retryWhen { cause, attempt ->
|
||||
if (cause is IOException && attempt < 3) {
|
||||
delay(1000L * (1 shl attempt.toInt()))
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -183,7 +188,7 @@ In KMP, use `Dispatchers.Default` and `Dispatchers.Main` (available on all platf
|
||||
Long-running loops must check for cancellation:
|
||||
|
||||
```kotlin
|
||||
suspend fun processItems(items: List<Item>) {
|
||||
suspend fun processItems(items: List<Item>) = coroutineScope {
|
||||
for (item in items) {
|
||||
ensureActive() // throws CancellationException if cancelled
|
||||
process(item)
|
||||
|
||||
Reference in New Issue
Block a user