Slide 1

Slide 1 text

Kyash AndroidͰ ৽͍͠ը໘Λ࡞Δ࣌ͷ ίʔυͷॻ͖ॱ Kyash meetup #1 @konifar

Slide 2

Slide 2 text

ઃܭࣗମͷ࿩΋͍͍Ͱ͕͢ ͱ͋ΔઃܭͷதͰ ଞͷਓ͕Ͳ͏ॻ͍͍ͯΔͷ͔ ؾʹͳΓ·ͤΜ͔ʁ

Slide 3

Slide 3 text

ࠓ೔࿩͢͜ͱ • Kyash AndroidΞϓϦͰ৽͍͠ը໘Λ։ൃ͢Δ ࣌ʹɺࣗ෼͕Ͳ͏͍͏ॱ൪ͰԿΛߟ͑ͳ͕Β ίʔυΛॻ͍͍ͯΔͷ͔ɻ
 
 ※ ݱঢ়͜͏΍ͬͯΔΑɺͱ͍͏࿩Ͱվળ఺΋͋Γ·͢ɻKyashͰ͸ৗʹมԽΛ ָ͠Έͳ͕Β։ൃ͍ͯ͠·͢ɻ

Slide 4

Slide 4 text

ࠓ೔࿩͞ͳ͍͜ͱ • MVVMͷৄࡉͳઆ໌ • DataBindingͷجຊతͳ಺༰ • DIɾDaggerͷઆ໌ • Ϣχοτςετͷॻ͖ํ • JetpackͳͲΛ࢖ͬͨࠓޙͷల๬

Slide 5

Slide 5 text

ϦΞϧΧʔυΛ༗ޮԽ͢Δ࣌ ͷը໘Λྫʹઆ໌͠·͢ɻ ※ Ұ෦ίʔυΛมߋ͍ͯ͠·͢

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

1. ด͡ΔϘλϯ 2. εΫϩʔϧͨ͠ΒӨ͕ͭ ͘Toolbar 3. ΧʔυൃߦࡁΈ͔Ͳ͏͔ APIͰऔಘͯ͠ɺൃߦࡁΈ ͩͬͨΒදࣔΛม͑ΔϨ ΠΞ΢τ 4. λοϓͨ͠ΒભҠ͢ΔϘ λϯͱϦϯΫ

Slide 8

Slide 8 text

7JFX.PEFM 6TF$BTF 3FQPTJUPSZ 7JFX "1*1SFGFSFODF

Slide 9

Slide 9 text

7JFX.PEFM 6TF$BTF 3FQPTJUPSZ 7JFX "1*1SFGFSFODF Activity.kt
 Fragment.kt
 activity.xml
 fragment.xml databinding ViewModel.kt CheckKyashCardExistsUseCase.kt KyashCardRepository.kt KyashApi.kt (Retrofit service)

Slide 10

Slide 10 text

7JFX.PEFM 6TF$BTF 3FQPTJUPSZ 7JFX "1*1SFGFSFODF Activity.kt
 Fragment.kt
 activity.xml
 fragment.xml databinding ViewModel.kt CheckKyashCardExistsUseCase.kt KyashCardRepository.kt KyashApi.kt (Retrofit service) σʔλऔ͖ͬͯͯ ϨΠΞ΢τʹදࣔ

Slide 11

Slide 11 text

σʔλऔಘͱϨΠΞ΢τදࣔ • ͲͪΒΛઌʹ࣮૷͢Δ͔͸ɺAPIͱσβΠϯͷ ͲͪΒ͕ઌʹͰ͖͍ͯΔ͔ʹΑΔɻ • API͕ઌʹͰ͖͍ͯΕ͹σʔλऔಘ෦෼ɺσβ Πϯ͕ઌʹ͋Ε͹ϨΠΞ΢τ͔Β࡞Δɻ • ͲͪΒ΋Ͱ͖͍ͯͳ͔ͬͨ৔߹͸ϨΠΞ΢τ͔ Βࡶʹ࡞͓ͬͯ͘ʢKyashͰ͸͋·Γͳ͍ʣ

Slide 12

Slide 12 text

σʔλऔಘ෦෼ͷ࣮૷ॱ • Ϋϥεґଘͷͳ͍ͱ͜Ζ͔Β࡞ΔɻAPIͷΫϥ ε΍ϝιου͕ͳ͍ͱRepositoryΛ࣮૷Ͱ͖ ͳ͍ʢTDDͰ΍Δ৔߹͸ผͰ͕͢ʣ • API => Repository => UseCase ͷॱ൪ɻ

Slide 13

Slide 13 text

KyashApi.kt • RetrofitͷΠϯλʔϑΣʔεʹϦΫΤετ༻ͷϝιουΛ௥Ճɻ • Ϩεϙϯε΍ύϥϝʔλͰ৽͍͠Entity͕ඞཁͳΒ͜ͷλΠϛ ϯάͰ࡞͓ͬͯ͘ɻ

Slide 14

Slide 14 text

KyashCardRepository.kt • nonceΛऔಘͯ͠ɺͦΕΛ࢖ͬͯผͷAPIΛୟ͘ɻ
 RxͷflatMapΛ࢖ͬͯAPIͷ௚ྻԽɻ

Slide 15

Slide 15 text

CheckKyashCardExistsUseCase.kt • UseCase͸ɺRepositoryͷϝιουͷ݁ՌΛϏδωεϩδοΫʹԊͬͨܗ ʢࠓճͩͱBooleanʣʹՃ޻͢Δɻ
 RxͩͱՃ޻͠΍͍͢ͷͰฦΓ஋͸Single΍Completableʹ͍ͯ͠Δɻ

Slide 16

Slide 16 text

ʊਓਓਓਓਓਓਓਓਓʊ ʼɹ͜͜ͰॳϏϧυɹʻ ʉ^Y^Y^Y^Y^Y^Y^ʉ

Slide 17

Slide 17 text

ॳΊͯͷϏϧυ • Ϗϧυ͕஗͍ͷͰɺσʔλऔಘ෦෼͸Ψοͱ Ұؾʹॻ͍ͯ͠·͏͜ͱ͕ଟ͍ɻ • ͜ͷྫͩͱUseCaseʹϩδοΫ͕ೖ͍ͬͯΔ ͷͰϢχοτςετ΋͜ͷλΠϛϯάͰॻ͘ɻ

Slide 18

Slide 18 text

ϨΠΞ΢τදࣔ෦෼ͷ࣮૷ॱ • Ϋϥεґଘͷͳ͍ͱ͜Ζ͔Β࡞Δɻ • ViewModel => xml => Fragment => Activity

Slide 19

Slide 19 text

ViewModelͷଊ͑ํ • ViewͷදࣔཁૉΛϓϩύςΟʹ࣋ͭɻ • View͔ΒͷΞΫγϣϯʢϥΠϑαΠΫϧ΍ λοϓͳͲʣΛϝιουͰ࣮૷͢Δɻ • ͲΜͳϓϩύςΟͱΞΫγϣϯ͕ඞཁ͔Λ಄ ͷதͰ੔ཧ͓ͯ͘͠ɻ

Slide 20

Slide 20 text

1. ΧʔυൃߦࡁΈ͔Ͳ͏͔νΣοΫ தͷϩʔυதදࣔͷVisibility 2. ൃߦࡁΈͩͬͨ࣌ͷViewͷ Visibility 3. ະൃߦͩͬͨ࣌ͷViewͷVisibility දࣔཁૉͱͳΔϓϩύςΟ

Slide 21

Slide 21 text

ViewModel.kt - ϓϩύςΟ • ίϯετϥΫλʹ͸ɺΧʔυൃߦࡁΈ͔Ͳ͏͔ΛνΣοΫ͢ΔUseCaseͱը໘ ભҠͷͨΊͷNavigatorΫϥεΛDaggerͰInjectɻ • ViewͷදࣔʹඞཁͳVisibilityͷIntͷϓϩύςΟΛॻ͘ɻ͜ͷྫͰ͸Visibilityͩ ͚͕ͩɺදࣔ͢ΔςΩετͷStringͳͲ΋ViewModelʹॻ͍͍ͯΔɻ

Slide 22

Slide 22 text

1. onResumeͰΧʔυൃߦ͍ͯ͠ Δ͔Ͳ͏͔ͷνΣοΫ 2. λοϓͨ͠Βը໘ભҠ ΞΫγϣϯ

Slide 23

Slide 23 text

ViewModel.kt - onResume() • ϩʔυͨ݁͠ՌʹΑͬͯϓϩύςΟΛมߋ͢Δɻ͜ͷϓϩύςΟΛ͋ͱͰdatabindingͰxmlʹόΠϯυ͢Δͧʔͱ͍͏ؾ࣋ͪͰॻ͘ɻ • ͪͳΈʹ subscribeOnͱobserveOnΛ͜͜Ͱ྆ํ΍Δͷ͸͋·ΓΑ͘ͳ͍ͱࢥ͍ͬͯΔɻ

Slide 24

Slide 24 text

ʊਓਓਓਓਓਓਓਓਓਓਓʊ ʼɹ͜͜ͰςετΛॻ͘ɹʻ ʉ^Y^Y^Y^Y^Y^Y^Y^ʉ

Slide 25

Slide 25 text

σʔλऔಘͱදࣔͷςετ • UseCaseΛϞοΫͯ͠ɺϝιου͕ݺ͹Εͯ ͍Δ͔ΛVerify͢Δɻ • ϝιουͷฦΓ஋ͷ݁ՌʢSingleͷsuccess΍ errorʣʹΑͬͯɺϓϩύςΟͷ஋͕ద੾ʹม ߋ͞Ε͍ͯΔ͔Λςετ͢Δɻ

Slide 26

Slide 26 text

ViewModel.kt - ด͡ΔϘλϯ • DataBindingͷonClickͰόΠϯυ͢ΔͨΊʹɺҾ਺ʹ͸ViewΛ౉͢ɻ • Navigator͸ݱࡏͷActivityͷࢀরΛ͍࣋ͬͯͯɺfinishActivity() ΛݺͿͱ Activity͕ด͡ΔʢNavigatorΛͻͱͭ࡞Δ΍Γํ͕͍͍͔ʹ͍ͭͯ͸ݕ౼ ͷ༨஍͋ΓͰ͢ʣ

Slide 27

Slide 27 text

• ͢Ͱʹը໘ભҠઌ͕͋Δ৔߹ʹ͸navigatorͷϝιουΛݺͿΑ͏ʹ͢Δɻ • ·ͩͰ͖͍ͯͳ͍৔߹͸TODOίϝϯτ͚ͩॻ͍͓ͯ͘ɻ ViewModel.kt - ϘλϯͱϦϯΫ

Slide 28

Slide 28 text

ʊਓਓਓਓਓਓਓਓਓਓਓʊ ʼɹ͜͜ͰςετΛॻ͘ɹʻ ʉ^Y^Y^Y^Y^Y^Y^Y^ʉ

Slide 29

Slide 29 text

ը໘ભҠͷςετ • NavigatorΛϞοΫͯ͠ɺద੾ͳϝιουͱҾ ਺͕ݺ͹Ε͍ͯΔ͔ΛVerify͢Δ͜ͱͰը໘ભ ҠͷςετΛॻ͘ɻ

Slide 30

Slide 30 text

fragment.xml • dataʹViewModelΛએݴɻ • ͜͜ͰඞཁʹͳΔͷͰɺViewModelͷํΛઌʹॻ͘Α͏ʹ͍ͯ͠Δɻ

Slide 31

Slide 31 text

fragment.xml - Toolbar • Toolbar ͸styleΛηοτ͢Δ͚ͩͰӨͷ༗ແɺ໭ΔϘλϯͷΞΠίϯͳͲΛม ͑ΒΕΔΑ͏ʹ͍ͯ͠Δɻ • navigationOnClickListenerʹViewModelͷΫϦοΫΠϕϯτΛηοτɻ • shadowAnimationScrollViewId͸͓ख੡ͷBindingAdapterͰɺScrollViewͷid Ληοτ͢ΔͱεΫϩʔϧ͢ΔͱӨ͕ͭ͘ಈ͖Λ͚ͭΒΕΔɻ

Slide 32

Slide 32 text

ToolbarExt.kt • Ҿ਺Ͱ౉͞ΕͨϨΠΞ΢τIDΛ΋ͱʹScrollViewΛ୳ͯ͠ɺεΫϩʔϧͨ͠ΒToolbar ͷelevationΛม͑ΔΑ͏ʹ͍ͯ͠Δɻ͜ΕʹݶΒͣɺlottieͷΞχϝʔγϣϯͳͲ Viewͷ໾ׂͰڞ௨ԽͰ͖ͦ͏ͳ΋ͷ͸݁ߏDataBindingͰ΍ΔΑ͏ʹ͍ͯ͠Δɻ

Slide 33

Slide 33 text

fragment.xml - දࣔ੾Γସ͑

Slide 34

Slide 34 text

ʊਓਓਓਓਓਓਓਓਓʊ ʼɹ͜͜ͰϏϧυᶄɹʻ ʉ^Y^Y^Y^Y^Y^Y^ʉ

Slide 35

Slide 35 text

̎ճ໨ͷϏϧυ • DataBinding͸ͨ·ʹͲ͕͜ѱ͍ͷ͔શ͘Θ͔ Βͳ͍ΤϥʔΛग़͖ͯͯͭ͠Β͍ɻ • xmlʹόΠϯυͨ͋͠ͱͰҰ౓Ϗϧυ͕௨ΔΑ ͏ʹ͓ͯ͘͠ͱ҆৺͢Δɻ

Slide 36

Slide 36 text

Fragment.kt

Slide 37

Slide 37 text

Activity.kt

Slide 38

Slide 38 text

ʊਓਓਓਓਓਓਓਓਓਓਓʊ ʼɹ͜͜Ͱ֬ೝͷϏϧυɹʻ ʉY^Y^Y^Y^Y^Y^Y^Yʉ

Slide 39

Slide 39 text

σόοάϝχϡʔ • ೚ҙͷը໘Λϝχϡʔ͔Β
 ։͚ΔΑ͏ʹ͍ͯ͠Δɻ • ͱΓ͋͑ͣ࡞ͬͨը໘Λ
 ͙͢ʹ։͍ͯ֬ೝ͍ͨ࣌͠ʹ
 ศརɻ

Slide 40

Slide 40 text

Զͷίʔυͷॻ͖ॱ·ͱΊ

Slide 41

Slide 41 text

σʔλऔಘɺϨΠΞ΢τදࣔ ͷͲͪΒ͔Βઌʹ࣮૷͢Δ͔ ͸APIͱσβΠϯͲͪΒ͕ ઌߦ͍ͯ͠Δ͔࣍ୈ

Slide 42

Slide 42 text

Ϗϧυ͕஗͍ͷͰ σʔλऔಘ෦෼͸Ұؾʹॻ͘

Slide 43

Slide 43 text

දࣔ෦෼͸ViewModelͷ ϓϩύςΟͱΞΫγϣϯ ʹ੔ཧͯ͠ॻ͘

Slide 44

Slide 44 text

DataBindingͰ ͭͳ͛ͯϏϧυͯ͠Έͯ Τϥʔ͕ग़ͳ͍͜ͱΛفΔ

Slide 45

Slide 45 text

ίʔυͷॻ͖ํ͸ ਓͦΕͧΕ

Slide 46

Slide 46 text

ઃܭ͞ΕͨΞϓϦͷίʔυΛ ࣮ࡍʹͲ͏ॻ͍͍ͯΔͷ͔ ͱ͍͏঺հͰͨ͠

Slide 47

Slide 47 text

͋Γ͕ͱ͏͍͟͝·ͨ͠