-
Notifications
You must be signed in to change notification settings - Fork 23
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Step2 pr 입니다! #74
Step2 pr 입니다! #74
Changes from all commits
4051acd
746da22
223582d
6c72377
0c8d07a
9b5f28f
9d17dfc
bc3393a
fa31107
ee5db40
15f8d37
bc538ec
0fa8037
9a6a0c0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
package nextstep.shoppingcart | ||
|
||
import androidx.compose.animation.EnterTransition | ||
import androidx.compose.animation.ExitTransition | ||
import androidx.compose.foundation.layout.padding | ||
import androidx.compose.runtime.Composable | ||
import androidx.compose.ui.Modifier | ||
import androidx.compose.ui.tooling.preview.Preview | ||
import androidx.compose.ui.unit.dp | ||
import androidx.navigation.compose.NavHost | ||
import androidx.navigation.compose.rememberNavController | ||
import nextstep.shoppingcart.enums.ScreenRouteType | ||
import nextstep.shoppingcart.navigation.navigateToProductDetail | ||
import nextstep.shoppingcart.navigation.navigateToShoppingCart | ||
import nextstep.shoppingcart.navigation.productDetailScreen | ||
import nextstep.shoppingcart.navigation.productListScreen | ||
import nextstep.shoppingcart.navigation.shoppingCartScreen | ||
import nextstep.shoppingcart.ui.theme.ShoppingCartTheme | ||
|
||
|
||
/** | ||
* Create Date: 2024. 9. 2. | ||
* | ||
* 장바구니 앱 - 화면 이동 처리를 위한 메인 화면 | ||
* navhost 구성 | ||
* @author LeeDongHun | ||
* | ||
* | ||
**/ | ||
@Composable | ||
fun MainScreen( | ||
modifier: Modifier = Modifier, | ||
) { | ||
val navHostController = rememberNavController() | ||
NavHost( | ||
modifier = modifier.padding(0.dp), | ||
navController = navHostController, | ||
startDestination = ScreenRouteType.SHOPPING_ITEM_LIST.navRoute, | ||
enterTransition = { EnterTransition.None }, | ||
exitTransition = { ExitTransition.None } | ||
) { | ||
// 상품 리스트 화면 | ||
productListScreen( | ||
onShoppingCartIconClicked = { | ||
navHostController.navigateToShoppingCart() | ||
}, | ||
onProductItemClicked = { clickedProductId -> | ||
navHostController.navigateToProductDetail(productId = clickedProductId) | ||
} | ||
) | ||
// 상품 상세 화면 | ||
productDetailScreen( | ||
addCartButtonClicked = { | ||
navHostController.navigateToShoppingCart() | ||
}, | ||
toolbarBackBtnClicked = { | ||
navHostController.popBackStack() | ||
} | ||
) | ||
// 쇼핑카트 화면 | ||
shoppingCartScreen( | ||
toolbarBackBtnClicked = { | ||
navHostController.popBackStack() | ||
} | ||
) | ||
} | ||
} | ||
|
||
/** | ||
* MainScreen 프리뷰 함수 | ||
*/ | ||
@Preview | ||
@Composable | ||
fun MainScreenPreview() { | ||
ShoppingCartTheme { | ||
MainScreen() | ||
} | ||
} | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
package nextstep.shoppingcart.component.button | ||
|
||
import androidx.compose.foundation.layout.fillMaxWidth | ||
import androidx.compose.foundation.layout.height | ||
import androidx.compose.material3.Button | ||
import androidx.compose.material3.ButtonDefaults | ||
import androidx.compose.material3.Text | ||
import androidx.compose.runtime.Composable | ||
import androidx.compose.ui.Modifier | ||
import androidx.compose.ui.graphics.Color | ||
import androidx.compose.ui.graphics.RectangleShape | ||
import androidx.compose.ui.res.stringResource | ||
import androidx.compose.ui.text.font.FontWeight | ||
import androidx.compose.ui.tooling.preview.Preview | ||
import androidx.compose.ui.unit.dp | ||
import androidx.compose.ui.unit.sp | ||
import nextstep.shoppingcart.R | ||
import nextstep.shoppingcart.ui.theme.Blue50 | ||
import nextstep.shoppingcart.ui.theme.ShoppingCartTheme | ||
|
||
/** | ||
* Create Date: 2024. 9. 15. | ||
* | ||
* 장바구니 담기 버튼 | ||
* @author LeeDongHun | ||
* | ||
* | ||
**/ | ||
@Composable | ||
fun AddCartButton( | ||
modifier: Modifier = Modifier, | ||
addCartButtonClicked: () -> Unit = {} | ||
) { | ||
Comment on lines
+29
to
+33
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 컴포넌트를 나누는 기준은 개발자마다 제각각인데요, 이번 기회에 본인만의 기준을 새우는 과정이 되었으면 합니다! thdev.tech/compose/2024/08/04/Android-Compose-Split-Funcation |
||
Button( | ||
colors = ButtonDefaults.buttonColors(Blue50), | ||
modifier = modifier | ||
.height(54.dp) | ||
.fillMaxWidth(), | ||
shape = RectangleShape, | ||
onClick = { | ||
addCartButtonClicked() | ||
}, content = { | ||
Text( | ||
text = stringResource(id = R.string.add_cart), | ||
color = Color.White, | ||
fontWeight = FontWeight.Bold, | ||
fontSize = 20.sp, | ||
) | ||
} | ||
) | ||
} | ||
|
||
/** | ||
* AddCartButton 프리뷰 함수 | ||
**/ | ||
@Preview | ||
@Composable | ||
fun AddCartButtonPreview() { | ||
ShoppingCartTheme { | ||
AddCartButton() | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
package nextstep.shoppingcart.component.image | ||
|
||
import androidx.compose.foundation.layout.aspectRatio | ||
import androidx.compose.runtime.Composable | ||
import androidx.compose.ui.Modifier | ||
import androidx.compose.ui.layout.ContentScale | ||
import androidx.compose.ui.tooling.preview.Preview | ||
import coil.compose.AsyncImage | ||
|
||
/** | ||
* Create Date: 2024. 9. 16. | ||
* | ||
* 상품 이미지는 리스트 화면이랑, 상세 화면에서 사용되므로 component화 시킴 | ||
* @author LeeDongHun | ||
* | ||
* | ||
**/ | ||
@Composable | ||
fun ProductImage( | ||
productThumbnail:String, | ||
imageRatio:ProductImageRatioType = ProductImageRatioType.SHOPPING_ITEM_THUMBNAIL_RATIO | ||
){ | ||
AsyncImage( | ||
modifier = Modifier.aspectRatio(imageRatio.ratio), | ||
contentScale = ContentScale.Crop, | ||
model = productThumbnail, | ||
contentDescription = "상품 썸네일 이미지", | ||
) | ||
} | ||
|
||
/** | ||
* 상품 이미지 비율 타입 | ||
*/ | ||
enum class ProductImageRatioType(val ratio:Float) { | ||
SHOPPING_ITEM_THUMBNAIL_RATIO(0.98f / 1f), | ||
SHOPPING_ITEM_DETAIL_RATIO(1f) | ||
} | ||
|
||
|
||
/** | ||
* ProductImage 프리뷰 함수 | ||
**/ | ||
@Preview( | ||
showBackground = true, | ||
backgroundColor = 0xFFFFFFFFL | ||
) | ||
@Composable | ||
fun ProductImagePreview() { | ||
ProductImage( | ||
productThumbnail = "https://picsum.photos/200/300", | ||
imageRatio = ProductImageRatioType.SHOPPING_ITEM_DETAIL_RATIO, | ||
) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
PR 본문에 남겨주신 질문에 대한 답변을 남깁니다!
가장 큰 원인은 수업 시간에도 잠깐 다뤘듯 Lambda가 현재는 불안정한 외부 값을 캡쳐하고 있어서 그렇습니다. 🫠
예를 들어 PR 본문에 남겨주신 아래와 같은 코드를,
다음과 같이 remember를 붙이면 recomposition이 발생하지 않을겁니다.
이렇게 불필요한 리컴포지션을 방지하기 위해 remember 붙이는 방법 외에도 여러 가지 방법이 있으니 이번 기회에 찾아보시는 것도 도움이 될거예요!
다음 글도 도움이 되길 바래요.
https://velog.io/@skydoves/compose-stability