Skip to content
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

[BugFix] OrbitPickerItem 초기화 및 재구성 시 상태 동기화 문제 #37

Merged
merged 6 commits into from
Jan 14, 2025

Conversation

DongChyeon
Copy link
Member

Related issue 🛠

closed #35
closes #36

어떤 변경사항이 있었나요?

  • 🐞 BugFix Something isn't working
  • 🎨 Design Markup & styling
  • 📃 Docs Documentation writing and editing (README.md, etc.)
  • [] ✨ Feature Feature
  • 🔨 Refactor Code refactoring
  • ⚙️ Setting Development environment setup
  • ✅ Test Test related (Junit, etc.)

CheckPoint ✅

PR이 다음 요구 사항을 충족하는지 확인하세요.

  • PR 컨벤션에 맞게 작성했습니다. (필수)
  • merge할 브랜치의 위치를 확인해 주세요(main❌/develop⭕) (필수)
  • Approve된 PR은 assigner가 머지하고, 수정 요청이 온 경우 수정 후 다시 push를 합니다. (필수)
  • BugFix의 경우, 버그의 원인을 파악하였습니다. (선택)

Work Description ✏️

2025-01-14.6.46.16.mov

해당 2가지 문제가 있었습니다.

  1. LazyListState의 초기화 로직이 재구성 시 여러 번 실행되며, 예상치 못한 스크롤 동작을 유발.
  2. selectedItem 값이 재구성 이후에도 부모와 불일치하여 상태 꼬임 발생.

이를 해결하기 위해 다음 방안을 적용하였습니다.

  1. PickerState를 통해 LazyListState, startIndex, selectedItem을 묶어서 관리
  2. rememberPickerState를 활용하여 LazyListState와 startIndex의 초기화 로직이 Recomposition 시 여러 번 실행되지 않도록 제어

또한, onScrollCompleted()를 통해 PickerItem의 값들이 한바퀴 이상 순환할 경우 호출할 메소드를 넣을 수 있도록 하였습니다.

if ((previousAdjustedIndex == 0 && adjustedIndex == lastIndex) || 
    (previousAdjustedIndex == lastIndex && adjustedIndex == 0)) {
    onScrollCompleted()
}

해당 변경사항을 통해 hour이 한바퀴 이상 순환할 경우 AM/PM이 토글되도록 하였습니다.

Uncompleted Tasks 😅

N/A

To Reviewers 📢

행복해요

@DongChyeon DongChyeon added 📱 UI 사용자 인터페이스 관련 작업 💪 동현동현동현동현동현 labels Jan 14, 2025
@DongChyeon DongChyeon self-assigned this Jan 14, 2025
Copy link
Member

@MoonsuKang MoonsuKang left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수고 하셨습니다 ㅋㅋ
역시 피커는 참 어렵네요.
우리 이거 끝나면 라이브러리로 내도 되겠어요

Comment on lines +8 to +13
class PickerState(
val lazyListState: LazyListState,
var selectedItem: String,
var startIndex: Int,
var initialized: Boolean = false,
)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p4
LazyListState의 내부코드를 한 번 읽어봤습니다.

firstVisibleItemIndex, firstVisibleItemScrollOffset 요런개 있더라구요!
그래서

class PickerState(
    val lazyListState: LazyListState,
    val startIndex: Int
)

이렇게만 남겨두고
selectedItem은

val index = firstVisibleItemIndex % items.size

이렇게 계산하는 확장함수로도 뺄 수 있는 방법이 있을 것 같습니다!
Picker 상태관리를 조금 더 단순화 하고 싶다면 이 방법을 선택하는 것도 나쁘지 않을 것 같다는 생각!

@DongChyeon DongChyeon merged commit e0d4d44 into develop Jan 14, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
💪 동현동현동현동현동현 📱 UI 사용자 인터페이스 관련 작업
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[BugFix] OrbitPickerItem 초기화 및 재구성 시 상태 동기화 문제
2 participants