CH03 TODO App

  • TODO App 을 μœ„ μŠ¬λΌμ΄λ“œμ— λ‚˜μ˜¨ μ„Έ κ°€μ§€ λ°©μ‹μœΌλ‘œ 각각 총 μ„Έ 번 κ΅¬ν˜„ν•œλ‹€.

  • ν•˜λ‚˜μ˜ 폴더 내에 μ„Έ 앱을 각각 λ§Œλ“€κ³ , μ†ŒμŠ€λŠ” 폴더 μ΅œμƒλ‹¨μ—μ„œ git init ν•΄μ„œ 관리해야겠닀.

  • Independent State 의 μ˜ˆμ‹œλ‘œλŠ” TODO Item 의 β€˜μ™„λ£Œμ—¬λΆ€β€™ λ₯Ό λ“€ 수 μžˆλ‹€.

    • λΆˆλ³€ν•˜λŠ” 값이 μ•„λ‹ˆκ³  μ™„λ£Œκ°€ 될 경우 값이 λ³€ν•˜λŠ” μ„±μ§ˆμ΄ 있고, 이 λ³€κ²½μ˜ 여뢀에 따라 Widget 의 rebuild κ°€ ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ— ChangeNotifierProvider λ₯Ό μ‚¬μš©ν•΄μ•Όν•œλ‹€.

  • Computed State λŠ” λ‹€λ₯Έ 것(것듀) 에 의쑴된 Computed 된 값이닀. μ˜ˆμ‹œλ‘œλŠ” β€˜λ―Έμ™„λ£Œ Item μˆ˜β€™ λ₯Ό λ“€ 수 μžˆλ‹€.

μ΅œμ’…μ μœΌλ‘œ StateNotifierProvider 둜 앱을 κ΅¬ν˜„ν–ˆλ‹€. κΉƒν—ˆλΈŒμ— ν‘Έμ‹œν•΄λ‘μ—ˆλ‹€. 기둝을 μœ„ν•΄ Provider μ£Όμž… λΆ€λΆ„κ³Ό independent state, computed state μƒ˜ν”Œλ§Œ μ½”λ“œλ₯Ό 남긴닀.

State λ₯Ό λ‹€λ£°λ•Œ immutable state 을 μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 이유 (+ Equatable 원리)

Todo app μ‹€μŠ΅ 쀑 todo λ₯Ό μ‚­μ œν•˜λŠ” κ³Όμ •μ—μ„œ rebuild κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ” ν˜„μƒμ΄ λ°œμƒν–ˆλ‹€. κ·Έλž˜μ„œ κ°•μ‚¬λ‹˜ μ½”λ“œλ₯Ό 보고 μˆ˜μ •ν–ˆλ”λ‹ˆ rebuild κ°€ 잘 μž‘λ™ν–ˆλ‹€. 덕뢄에 κΈ°κ³„μ μœΌλ‘œ μ‚¬μš©ν–ˆλ˜ Equatable 을 λ‹€μ‹œ μ‚΄νŽ΄λ΄€κ³ , Notifier 의 state 비ꡐ λ‘œμ§λ„ λ‹€μ‹œ μ‚΄νŽ΄λ³΄μ•˜λ‹€.

Object.dart 의 == 과 hashCode

dart 의 λͺ¨λ“  객체듀은 Object λ₯Ό μƒμ†ν•˜κ³  있으며, Object 의 == 은 μ•„λž˜μ™€ κ°™λ‹€.

The default behavior for all [Object]s is to return true if and only if this object and [other] are the same object. 핡심은 이 문ꡬ닀. μ£Όμ†Œκ°’μ΄ κ°™μ•„μ•Ό Object 의 == λŠ” true λ₯Ό return ν•œλ‹€.

μ’…ν•©ν•΄μ„œ 보면 dart μ—μ„œ νŠΉλ³„νžˆ == 을 override ν•˜μ§€ μ•ŠλŠ” 이상, μ£Όμ†Œκ°’μ΄ κ°™μ•„μ•Όλ§Œ == μ—μ„œ true λ₯Ό 받을 수 있고 κ·Έ μ™Έμ—λŠ” λͺ¨λ‘ false 이닀.

또 == κ³Ό λ°€μ ‘ν•œ 연관이 μžˆλŠ”(== 에 영ν–₯을 μ£ΌλŠ”) hashCode λ₯Ό μ‚΄νŽ΄λ³΄μž.

If a subclass overrides [hashCode], it should override the [operator ==] operator as well to maintain consistency. λΌλŠ” 것을 보면 == λ₯Ό override ν•  경우 λ°˜λ“œμ‹œ hashCode 도 override ν•΄μ€˜μ•Ό ν•˜λŠ” 것을 μ•Œ 수 μžˆλ‹€.

Equatable μ—μ„œλŠ” == κ³Ό hashCode λ₯Ό override ν•œλ‹€

μ•„λž˜λŠ” Equatable 내에 μžˆλŠ” == 와 hashCode 이닀. 이λ₯Ό 보면 Equatable λ₯Ό 상속할 경우 Object 의 ==, hashCode λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³ , μ•„λž˜μ˜ Equatable 의 ==, hashCode λ₯Ό μ‚¬μš©ν•˜κ²Œ λœλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.

이λ₯Ό λ°”νƒ•μœΌλ‘œ Equatable 을 μƒμ†ν•˜κ³  μžˆλŠ” TodosState 을 μ‚΄νŽ΄λ³΄μž.

μœ„μ™€ 같이 todos μžμ²΄λŠ” λ‹€λ₯Έ μ£Όμ†Œκ°’μ„ κ°€μ§€κ³  μžˆμ–΄λ„ ν•΄λ‹Ή todos 의 ꡬ성이 todo1, todo2둜 같기에 todosState1, todosState2 의 hashCode λŠ” 같은 값을 return ν•˜κ³  비ꡐ μ—­μ‹œ true κ°€ return λœλ‹€.

μ΄λ²ˆμ—” μ›μ†Œμ˜ ꡬ성에 λ³€ν™”λ₯Ό 쀘보자.

κ²°κ΅­ μ΅œμ’…μ μœΌλ‘œ todosState1, todosState2 각각의 μ›μ†ŒλŠ” todos λΌλŠ” λ˜‘κ°™μ€ μΈμŠ€ν„΄μŠ€λ‹€. κ·Έλž˜μ„œ todos κ°€ μ–΄λ–»κ²Œ λ³€ν•˜λ“ μ§€κ°„μ— ν•΄λ‹Ή μ£Όμ†Œκ°’μ€ λ™μΌν•˜λ‹€. κ·Έλž˜μ„œ todosState1, todosState2 λŠ” λͺ¨λ‘ λ˜‘κ°™μ€ todos λΌλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μ›μ†Œλ‘œ κ°–κ³  μžˆμœΌλ―€λ‘œ 항상 같을 수 밖에 μ—†λ‹€.

λ‚΄κ°€ λ²”ν•œ μ‹€μˆ˜λŠ” 이 ν¬μΈνŠΈμ—μ„œ λ‚˜μ˜€λŠ”λ°, old state κ³Ό new state 을 μ§€κΈˆμ˜ μ˜ˆμ‹œμ—μ„œ todosState1, todosState2 둜 λ’€λ‹€. 즉, StateNotifier μ—μ„œ custom method λ₯Ό 톡해 state 에 λ³€ν™”λ₯Ό μ€˜μ•Ό ν•˜λŠ”λ° state μžμ²΄λŠ” κ·ΈλŒ€λ‘œ 두고 state λ‚΄μ˜ μ›μ†Œλ§Œ λ°”κΎΌ 것이닀.

λ‹€μ‹œ 말해, state 에 λ³€ν™” λ₯Ό μ€€λ‹€λŠ” 것은 identical νŒμ •μ— λŒ€ν•΄ μ™„μ „νžˆ λ³€ν™”λ₯Ό μ£ΌκΈ° μœ„ν•΄μ„œ μ£Όμ†Œκ°’ λ³€κ²½κΉŒμ§€ κ³ λ €ν–ˆμ–΄μ•Ό ν•˜λŠ”λ° λ™μΌν•œ 객체λ₯Ό 두고 λ‚΄λΆ€ μ›μ†Œλ§Œ λ°”κΏ”λ²„λ¦¬λ‹ˆ μœ„ μ˜ˆμ‹œμ²˜λŸΌ λ³€ν™”λ₯Ό μ€¬λ‹€ν•œλ“€ κ²°κ΅­ 같은 object κ°€ 된 것이닀. todosState1 μ—μ„œ todosState2 와 같이 λ°”κΏ¨μ§€λ§Œ κ²°κ΅­ 같은 object 인 것이닀.

κ·Έλž˜μ„œ state λ₯Ό λ‹€λ£°λ•ŒλŠ” μ™„μ „νžˆ immutable object 둜 μƒˆλ‘œ λ§Œλ“€μ–΄λ‚΄μ•Ό ν•œλ‹€. 그것이 μƒκ°ν•˜κΈ°λ„ νŽΈν•˜κ³  버그λ₯Ό μ€„μ΄λŠ” 방법이닀. 그럼 λ‚΄κ°€ μ‹€μˆ˜ν•œ μ½”λ“œλ₯Ό 보자.

잘λͺ»λœ μ½”λ“œλ₯Ό 보면 κ²°κ΅­ removeTodo() ν•¨μˆ˜κ°€ λ™μž‘ν•˜κΈ° μ „κ³Ό ν›„λŠ” state κ°€ κ°€μ§„ todos 의 λ‚΄μš©μ€ λ°”λ€Œμ—ˆμ„μ§€μ–Έμ •, todos μžμ²΄λŠ” κ·ΈλŒ€λ‘œμ΄κΈ° λ•Œλ¬Έμ— κ²°κ΅­ state 의 λ³€ν™”λŠ” λ°œμƒν•˜μ§€ μ•Šμ•˜λ‹€κ³  νŒμ •λœλ‹€. 고쳐진 μ½”λ“œμ—μ„œλŠ” removeWhere 이 μ•„λ‹ˆλΌ where 을 ν†΅ν•΄μ„œ ν•„μš”ν•œ μ›μ†Œλ“€μ„ 찾은 ν›„ toList() 둜 μ™„μ „νžˆ λ‹€λ₯Έ todos λ₯Ό λ§Œλ“€μ–΄μ„œ κ²°κ΅­ state λ₯Ό λ°”κΎΈκ³  μžˆλ‹€.

μΆ”κ°€λ‘œ Equatable κ³Ό κ΄€λ ¨ν•˜μ—¬ μ°Έκ³ ν•˜κΈ° μ’‹μ•˜λ˜ ν¬μŠ€νŒ… 링크λ₯Ό 남긴닀.

Last updated