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