-
Notifications
You must be signed in to change notification settings - Fork 0
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
Feat/#11 week4 compose 필수 과제 구현 #13
Conversation
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.
안녕하세요 혜음님. 안드로이드 파트 명예 OB 이현우입니다. 만나서 반갑습니다.
앞으로의 과제들에 대한 코드리뷰를 맡게 되었습니다. 고민해보시다가 궁금한 점이 있으시면 지식 공유방/디스코드 연락 해주세요. 대면/비대면 자유형식으로 추가 피드백 가능합니다.
우선 과제 어려우셨을텐데 빠르게 과제 수행해주신점 너무 좋습니다. 관련해서 추가적으로 피드백/질문 남긴 것들이 있습니다. 질문을 남긴 경우 코드에 문제가 있어서 질문이 남긴 것이 아니고 정말 혜음님의 작성 의도가 궁금해서 남긴 것이니 이 점 참고해주시면 감사하겠습니다.
앞으로 잘 부탁드리겠습니다.
@@ -13,7 +13,7 @@ import androidx.compose.ui.graphics.Color | |||
import androidx.compose.ui.unit.dp | |||
|
|||
@Composable | |||
fun HomeUi(viewModel: HomeViewModel) { | |||
fun HomeScreen(viewModel: HomeViewModel) { |
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.
fun HomeScreen(viewModel: HomeViewModel) { | |
fun HomeScreen(viewModel: HomeViewModel = viewModel()) { |
Compose에서 ViewModel은 함수 내에서 멤버변수로 직접 사용하거나 매개변수로 주입받는 경우에는 이런식으로 디폴트 매개변수로 주입받아서 호출부에서는
HomeScreen()
으로만 사용할 수 있게 작성하는 경향이 있습니다. 이 역시 취향의 영역이니 다른 분들 코드 종합적으로 보고, 직접 코드를 적어보시면서 어떤게 더 좋을지 판단해보시는 것이 좋을 것 같아요.
@@ -37,6 +37,7 @@ import androidx.compose.ui.unit.sp | |||
import com.sopt.now.compose.ui.theme.NOWSOPTAndroidTheme | |||
|
|||
class LoginActivity : ComponentActivity() { | |||
private val viewModel by viewModels<LoginViewModel>() |
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.
View 기반에서는 이와 같이 선언을 해도 되지만, 저희는 Compose를 사용하니 이 방식보다는 Compose 코드 내부에서 선언을 해보는 방식으로 변경해보는 것도 좋을 것 같습니다.
private fun initObserver() { | ||
viewModel.liveData.observe(this) { loginState -> | ||
Toast.makeText( | ||
this@LoginActivity, | ||
loginState.message, | ||
Toast.LENGTH_SHORT | ||
).show() |
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.
컴포즈 내부에서는 이런 상태들이나 이벤트들을 관찰해서 처리를 할 수 없을까요? 어떻게 구현해야 컴포즈 내부에서 상태/이벤트를 처리할 수 있을까요?
intent = Intent(this@LoginActivity,MainActivity::class.java) | ||
intent.putExtra("userId", viewModel.userId) |
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.
지금은 Intent 기반으로 화면이동을 하지만 이후에는 Compose-navigation을 사용하시면서 화면전환 로직 구축해보는 것도 좋을 것 같습니다.
pw: String, | ||
onIdChange: (String) -> Unit, | ||
onPwChange: (String) -> Unit |
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.
축약어는 지양하시는 것이 가독성에 좋습니다. pw -> password로 변경해보면 어떨까요?
private fun initViews(userId: String) { | ||
viewModel.userInfo(userId.toInt()) | ||
} |
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.
함수분리 좋습니다.
when (selectedItem) { | ||
0 -> { | ||
HomeUi(HomeViewModel()) | ||
HomeScreen(HomeViewModel()) | ||
} | ||
|
||
1 -> { | ||
Text(text = "Search") | ||
} | ||
|
||
2 -> { | ||
ProfileUi(userId, userPw, userNick) | ||
initObserver() | ||
ProfileScreen(userNick, userId, userPhone) | ||
} |
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.
selectedItem이 무엇이 있는지 모르는데 다른 개발자들이 0, 1, 2가 어떤건지 알고 추가적인 코드리뷰를 할 수 있을까요...? 물론 여기에서는 대략 홈, 검색, 프로필 화면인 것을 인지할 수 있긴 합니다만 코드가 좀만 더 길어지면 코드 보기가 더 어려워질 수 있으니 이 점 유의해서 코드 작성해주시면 좋을 것 같아요.
SignUpScreen( | ||
id, | ||
pw, | ||
nick, | ||
etc, | ||
phone, | ||
onIdChange = { id = it }, | ||
onPwChange = { pw = it }, | ||
onNickChange = { nick = it }, | ||
onEtcChange = { etc = it }) | ||
onPhoneChange = { phone = it }) |
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.
함수의 경우를 제외하고, 변수의 경우에는 각 패러미터에 어떤 값들이 들어가야 하는지 명시가 안되어있어서 에러를 일으킬 가능성이 농후해집니다. 컴포즈에서는 named argument 꼭 활용하시길 바랍니다.
var id by remember { mutableStateOf("") } | ||
var pw by remember { mutableStateOf("") } | ||
var nick by remember { mutableStateOf("") } | ||
var etc by remember { mutableStateOf("") } | ||
var phone by remember { mutableStateOf("") } |
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.
축약어 지양해주세요.
pw, nick
viewModel.liveData.observe(this) { signUpState -> | ||
Toast.makeText( | ||
this@SignUpActivity, | ||
signUpState.message, | ||
Toast.LENGTH_SHORT | ||
).show() | ||
|
||
if (signUpState.isSuccess) { | ||
finish() | ||
} | ||
} |
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.
Toast는 따지고 보면 화면에 영원히 띄워질 상태가 아니고 한번 띄워지고 말아야하는 상황이자나요. 지금 구현된 코드 기반에서는 화면 회전을 하거나 다크모드 전환을 했을 때 토스트가 한번 더 띄워질 수 있는 코드로 보여집니다. 확인 부탁드립니다.
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.
이번주도 너무 고생하셨어요!! 남은 부분은 후딱 해서 올려주세요~ 3조 더욱 열심히 정진합시다~
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.
고생하셨습니다!!!
xml과 공통되는 부분은 일부러 코멘트 안달았으니 xml에 달린 것들은 여기서도 수정부탁드립니다!!
interface UserService { | ||
@GET("/member/info") | ||
fun userInfo( | ||
@Header("memberId") userId : Int | ||
) : Call<ResponseUserInfoDto> | ||
} |
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.
헤더도 인터셉터로 넣어봐요~
Text( | ||
text = stringResource(R.string.text_id) | ||
) | ||
TextField( | ||
value = id, | ||
onValueChange = onIdChange, | ||
modifier = Modifier | ||
.fillMaxWidth() | ||
.padding(10.dp), | ||
placeholder = { Text(stringResource(R.string.tf_login_id)) }, | ||
singleLine = true, | ||
leadingIcon = { Icon(Icons.Filled.Person, contentDescription = "User Icon") } | ||
) | ||
Spacer(modifier = Modifier.height(30.dp)) | ||
Text(text = stringResource(R.string.text_pw)) | ||
TextField( | ||
value = pw, | ||
onValueChange = onPwChange, | ||
modifier = Modifier | ||
.fillMaxWidth() | ||
.padding(10.dp), | ||
placeholder = { Text(stringResource(R.string.tf_login_pw)) }, | ||
singleLine = true, | ||
visualTransformation = PasswordVisualTransformation(), | ||
leadingIcon = { Icon(Icons.Filled.Lock, contentDescription = "Lock Icon") }, | ||
) |
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.
중복되는 친구들은 component로 빼보는건 어떨까용
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.
이번 주차도 고생하셨습니다👏👏
저도 xml과 거의 동일하게 구현해서 반갑네요...
이번주에 같이 보완해봅시다!!
private fun initObserver() { | ||
viewModel.liveData.observe(this) { loginState -> | ||
Toast.makeText( | ||
this@LoginActivity, | ||
loginState.message, | ||
Toast.LENGTH_SHORT | ||
).show() |
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.
오 저는 xml 그대로 사용하려다가 오류가 나서 찾아보니 컴포즈에서 observeAsState()를 사용하더라구요! 요것도 한번 찾아보시면 좋을 것 같아요!
안녕하세요! 귀한 시간 내어 코드리뷰 달아주신 점 너무 감사드립니다! 리뷰에 달아주신 내용들은 반영할 수 있는만큼 최대한으로 반영하여 좋은 코드 작성할 수 있도록 노력하겠습니다. 아직 부족한 실력이지만 앞으로 잘부탁드립니다 :) |
📌𝘐𝘴𝘴𝘶𝘦𝘴
📎𝘞𝘰𝘳𝘬 𝘋𝘦𝘴𝘤𝘳𝘪𝘱𝘵𝘪𝘰𝘯
📷𝘚𝘤𝘳𝘦𝘦𝘯𝘴𝘩𝘰𝘵
compose.mp4
💬𝘛𝘰 𝘙𝘦𝘷𝘪𝘦𝘸𝘦𝘳𝘴
홈 프래그먼트 팔로워랑 비밀번호 부분을 아직 완성못했는데 완성하는대로 바로 푸쉬하겠습니다!
api 연결은 컴포즈와 xml 코드가 거의 동일하게 작성되었습니다..!
코리 남겨주시면 열심히열심히 반영하겠습니다..!
앗 그리고 api를 이리저리 시도하다보니 이번에 커밋을 쪼개지 못했네요..담번에는 꼭 세밀하게 커밋하겠습니다!
코리 반영하기