Conversation
| debugImplementation("androidx.compose.ui:ui-tooling") | ||
| implementation("androidx.compose.runtime:runtime-livedata") | ||
| implementation("androidx.lifecycle:lifecycle-runtime-compose:2.8.0") | ||
| implementation("io.coil-kt:coil-compose:2.7.0") |
There was a problem hiding this comment.
Все новые зависимости стоит делать через version catalog механизм - файл libs.versions.toml, чтобы все внешние зависимости проекта находились в одном месте - так удобнее будет с ними работать, а также все модули проекта будут зависеть от одних и тех же версий сторонних зависимостей. В Android Studio можно это сделать автоматически - нужно поставить каретку на зависимость, нажать Alt + Enter (cmd + Enter на маке) и выбрать соответствующий пункт, чтобы автоматически мигрировать зависимость на versions catalog
| single<suspend () -> List<Track>>(named("getFavoritesOnce")) { | ||
| suspend { get<FavoritesInteractor>().observeFavorites().first() } | ||
| } |
There was a problem hiding this comment.
Лучше это в юзкейс вынести, а не создавать как лямбду, так как это бизнес логика
|
|
||
| import com.example.playlistmaker.search.domain.model.Track | ||
|
|
||
| data class MediaLibraryState( |
There was a problem hiding this comment.
Данные, передаваемые в композабл функции лучше помечать аннотацией @Immutable, чтобы повысить стабильность и исключить рекомпозиции из-за этого параметра
| fun reload() { | ||
| viewModelScope.launch { | ||
| val favDef = async { runCatching { getFavoritesOnce() }.getOrElse { emptyList() } } | ||
| val plsDef = async { runCatching { getPlaylistsOnce() }.getOrElse { emptyList() } } |
There was a problem hiding this comment.
runCatching не стоит использовать с suspend вызовами, так как такой код конфликтует с механизмом отмены корутин через CancellationException
| val bg = colorResource(R.color.color_background) | ||
| val textPrimary = colorResource(R.color.black_setting) | ||
| val rowStart = dimensionResource(R.dimen.margin_start) | ||
| val rowV = dimensionResource(R.dimen.layout_margin_setting) | ||
| val iconSize = dimensionResource(R.dimen.margin_bottom_setting) | ||
| val rowEnd = dimensionResource(R.dimen.margin_setting_end) | ||
| val headerBottom = dimensionResource(R.dimen.margin_bottom_setting) | ||
| val blue = colorResource(R.color.blue) | ||
| val gray = colorResource(R.color.color_gray) | ||
| val white = colorResource(R.color.white) |
There was a problem hiding this comment.
Эти переменные нет смысла объявлять тут, лучше заинлайнить вызов функции
| Row( | ||
| modifier = Modifier | ||
| .fillMaxWidth() | ||
| .clickable(onClick = onAgreementClick) | ||
| .padding(start = rowStart, end = rowEnd), | ||
| verticalAlignment = Alignment.CenterVertically | ||
| ) { | ||
| Text( | ||
| text = stringResource(R.string.agrement), | ||
| style = TextStyle( | ||
| fontFamily = YSDisplay, | ||
| fontWeight = FontWeight.Normal, | ||
| fontSize = 16.sp, | ||
| lineHeight = 16.sp, | ||
| color = textPrimary | ||
| ), | ||
| modifier = Modifier.weight(1f) | ||
| ) | ||
| IconM3( | ||
| imageVector = Icons.Outlined.ChevronRight, | ||
| contentDescription = null, | ||
| tint = iconTint, | ||
| modifier = Modifier.size(iconSize) | ||
| ) | ||
| } |
There was a problem hiding this comment.
Дублирующийся код лучше выносить в отдельные функции и переиспользовать




Level 1