Kyash meetup #1
Kyash AndroidͰ৽͍͠ը໘Λ࡞Δ࣌ͷίʔυͷॻ͖ॱKyash meetup #1@konifar
View Slide
ઃܭࣗମͷ͍͍Ͱ͕͢ͱ͋ΔઃܭͷதͰଞͷਓ͕Ͳ͏ॻ͍͍ͯΔͷ͔ؾʹͳΓ·ͤΜ͔ʁ
ࠓ͢͜ͱ• Kyash AndroidΞϓϦͰ৽͍͠ը໘Λ։ൃ͢Δ࣌ʹɺ͕ࣗͲ͏͍͏ॱ൪ͰԿΛߟ͑ͳ͕ΒίʔυΛॻ͍͍ͯΔͷ͔ɻ ※ ݱঢ়͜͏ͬͯΔΑɺͱ͍͏Ͱվળ͋Γ·͢ɻKyashͰৗʹมԽΛָ͠Έͳ͕Β։ൃ͍ͯ͠·͢ɻ
ࠓ͞ͳ͍͜ͱ• MVVMͷৄࡉͳઆ໌• DataBindingͷجຊతͳ༰• DIɾDaggerͷઆ໌• Ϣχοτςετͷॻ͖ํ• JetpackͳͲΛͬͨࠓޙͷల
ϦΞϧΧʔυΛ༗ޮԽ͢Δ࣌ͷը໘Λྫʹઆ໌͠·͢ɻ※ Ұ෦ίʔυΛมߋ͍ͯ͠·͢
1. ด͡ΔϘλϯ2. εΫϩʔϧͨ͠ΒӨ͕ͭ͘Toolbar3. ΧʔυൃߦࡁΈ͔Ͳ͏͔APIͰऔಘͯ͠ɺൃߦࡁΈͩͬͨΒදࣔΛม͑ΔϨΠΞτ4. λοϓͨ͠ΒભҠ͢ΔϘλϯͱϦϯΫ
7JFX.PEFM6TF$BTF3FQPTJUPSZ7JFX"1*1SFGFSFODF
7JFX.PEFM6TF$BTF3FQPTJUPSZ7JFX"1*1SFGFSFODFActivity.kt Fragment.kt activity.xml fragment.xmldatabindingViewModel.ktCheckKyashCardExistsUseCase.ktKyashCardRepository.ktKyashApi.kt (Retrofit service)
7JFX.PEFM6TF$BTF3FQPTJUPSZ7JFX"1*1SFGFSFODFActivity.kt Fragment.kt activity.xml fragment.xmldatabindingViewModel.ktCheckKyashCardExistsUseCase.ktKyashCardRepository.ktKyashApi.kt (Retrofit service)σʔλऔ͖ͬͯͯ ϨΠΞτʹදࣔ
σʔλऔಘͱϨΠΞτදࣔ• ͲͪΒΛઌʹ࣮͢Δ͔ɺAPIͱσβΠϯͷͲͪΒ͕ઌʹͰ͖͍ͯΔ͔ʹΑΔɻ• API͕ઌʹͰ͖͍ͯΕσʔλऔಘ෦ɺσβΠϯ͕ઌʹ͋ΕϨΠΞτ͔Β࡞Δɻ• ͲͪΒͰ͖͍ͯͳ͔ͬͨ߹ϨΠΞτ͔Βࡶʹ࡞͓ͬͯ͘ʢKyashͰ͋·Γͳ͍ʣ
σʔλऔಘ෦ͷ࣮ॱ• Ϋϥεґଘͷͳ͍ͱ͜Ζ͔Β࡞ΔɻAPIͷΫϥεϝιου͕ͳ͍ͱRepositoryΛ࣮Ͱ͖ͳ͍ʢTDDͰΔ߹ผͰ͕͢ʣ• API => Repository => UseCase ͷॱ൪ɻ
KyashApi.kt• RetrofitͷΠϯλʔϑΣʔεʹϦΫΤετ༻ͷϝιουΛՃɻ• ϨεϙϯεύϥϝʔλͰ৽͍͠Entity͕ඞཁͳΒ͜ͷλΠϛϯάͰ࡞͓ͬͯ͘ɻ
KyashCardRepository.kt• nonceΛऔಘͯ͠ɺͦΕΛͬͯผͷAPIΛୟ͘ɻ RxͷflatMapΛͬͯAPIͷྻԽɻ
CheckKyashCardExistsUseCase.kt• UseCaseɺRepositoryͷϝιουͷ݁ՌΛϏδωεϩδοΫʹԊͬͨܗʢࠓճͩͱBooleanʣʹՃ͢Δɻ RxͩͱՃ͍͢͠ͷͰฦΓSingleCompletableʹ͍ͯ͠Δɻ
ʊਓਓਓਓਓਓਓਓਓʊʼɹ͜͜ͰॳϏϧυɹʻʉ^Y^Y^Y^Y^Y^Y^ʉ
ॳΊͯͷϏϧυ• Ϗϧυ͕͍ͷͰɺσʔλऔಘ෦ΨοͱҰؾʹॻ͍ͯ͠·͏͜ͱ͕ଟ͍ɻ• ͜ͷྫͩͱUseCaseʹϩδοΫ͕ೖ͍ͬͯΔͷͰϢχοτςετ͜ͷλΠϛϯάͰॻ͘ɻ
ϨΠΞτදࣔ෦ͷ࣮ॱ• Ϋϥεґଘͷͳ͍ͱ͜Ζ͔Β࡞Δɻ• ViewModel => xml => Fragment => Activity
ViewModelͷଊ͑ํ• ViewͷදࣔཁૉΛϓϩύςΟʹ࣋ͭɻ• View͔ΒͷΞΫγϣϯʢϥΠϑαΠΫϧλοϓͳͲʣΛϝιουͰ࣮͢Δɻ• ͲΜͳϓϩύςΟͱΞΫγϣϯ͕ඞཁ͔Λ಄ͷதͰཧ͓ͯ͘͠ɻ
1. ΧʔυൃߦࡁΈ͔Ͳ͏͔νΣοΫதͷϩʔυதදࣔͷVisibility2. ൃߦࡁΈͩͬͨ࣌ͷViewͷVisibility3. ະൃߦͩͬͨ࣌ͷViewͷVisibilityදࣔཁૉͱͳΔϓϩύςΟ
ViewModel.kt - ϓϩύςΟ• ίϯετϥΫλʹɺΧʔυൃߦࡁΈ͔Ͳ͏͔ΛνΣοΫ͢ΔUseCaseͱը໘ભҠͷͨΊͷNavigatorΫϥεΛDaggerͰInjectɻ• ViewͷදࣔʹඞཁͳVisibilityͷIntͷϓϩύςΟΛॻ͘ɻ͜ͷྫͰVisibility͚͕ͩͩɺදࣔ͢ΔςΩετͷStringͳͲViewModelʹॻ͍͍ͯΔɻ
1. onResumeͰΧʔυൃߦ͍ͯ͠Δ͔Ͳ͏͔ͷνΣοΫ2. λοϓͨ͠Βը໘ભҠΞΫγϣϯ
ViewModel.kt - onResume()• ϩʔυͨ݁͠ՌʹΑͬͯϓϩύςΟΛมߋ͢Δɻ͜ͷϓϩύςΟΛ͋ͱͰdatabindingͰxmlʹόΠϯυ͢Δͧʔͱ͍͏ؾ࣋ͪͰॻ͘ɻ• ͪͳΈʹ subscribeOnͱobserveOnΛ͜͜Ͱ྆ํΔͷ͋·ΓΑ͘ͳ͍ͱࢥ͍ͬͯΔɻ
ʊਓਓਓਓਓਓਓਓਓਓਓʊʼɹ͜͜ͰςετΛॻ͘ɹʻʉ^Y^Y^Y^Y^Y^Y^Y^ʉ
σʔλऔಘͱදࣔͷςετ• UseCaseΛϞοΫͯ͠ɺϝιου͕ݺΕ͍ͯΔ͔ΛVerify͢Δɻ• ϝιουͷฦΓͷ݁ՌʢSingleͷsuccesserrorʣʹΑͬͯɺϓϩύςΟͷ͕దʹมߋ͞Ε͍ͯΔ͔Λςετ͢Δɻ
ViewModel.kt - ด͡ΔϘλϯ• DataBindingͷonClickͰόΠϯυ͢ΔͨΊʹɺҾʹViewΛ͢ɻ• NavigatorݱࡏͷActivityͷࢀরΛ͍࣋ͬͯͯɺfinishActivity() ΛݺͿͱActivity͕ด͡ΔʢNavigatorΛͻͱͭ࡞ΔΓํ͕͍͍͔ʹ͍ͭͯݕ౼ͷ༨͋ΓͰ͢ʣ
• ͢Ͱʹը໘ભҠઌ͕͋Δ߹ʹnavigatorͷϝιουΛݺͿΑ͏ʹ͢Δɻ• ·ͩͰ͖͍ͯͳ͍߹TODOίϝϯτ͚ͩॻ͍͓ͯ͘ɻViewModel.kt - ϘλϯͱϦϯΫ
ը໘ભҠͷςετ• NavigatorΛϞοΫͯ͠ɺదͳϝιουͱҾ͕ݺΕ͍ͯΔ͔ΛVerify͢Δ͜ͱͰը໘ભҠͷςετΛॻ͘ɻ
fragment.xml• dataʹViewModelΛએݴɻ• ͜͜ͰඞཁʹͳΔͷͰɺViewModelͷํΛઌʹॻ͘Α͏ʹ͍ͯ͠Δɻ
fragment.xml - Toolbar• Toolbar styleΛηοτ͢Δ͚ͩͰӨͷ༗ແɺΔϘλϯͷΞΠίϯͳͲΛม͑ΒΕΔΑ͏ʹ͍ͯ͠Δɻ• navigationOnClickListenerʹViewModelͷΫϦοΫΠϕϯτΛηοτɻ• shadowAnimationScrollViewId͓खͷBindingAdapterͰɺScrollViewͷidΛηοτ͢ΔͱεΫϩʔϧ͢ΔͱӨ͕ͭ͘ಈ͖Λ͚ͭΒΕΔɻ
ToolbarExt.kt• ҾͰ͞ΕͨϨΠΞτIDΛͱʹScrollViewΛ୳ͯ͠ɺεΫϩʔϧͨ͠ΒToolbarͷelevationΛม͑ΔΑ͏ʹ͍ͯ͠Δɻ͜ΕʹݶΒͣɺlottieͷΞχϝʔγϣϯͳͲViewͷׂͰڞ௨ԽͰ͖ͦ͏ͳͷ݁ߏDataBindingͰΔΑ͏ʹ͍ͯ͠Δɻ
fragment.xml - දࣔΓସ͑
ʊਓਓਓਓਓਓਓਓਓʊʼɹ͜͜ͰϏϧυᶄɹʻʉ^Y^Y^Y^Y^Y^Y^ʉ
̎ճͷϏϧυ• DataBindingͨ·ʹͲ͕͜ѱ͍ͷ͔શ͘Θ͔Βͳ͍ΤϥʔΛग़͖ͯͯͭ͠Β͍ɻ• xmlʹόΠϯυͨ͋͠ͱͰҰϏϧυ͕௨ΔΑ͏ʹ͓ͯ͘͠ͱ҆৺͢Δɻ
Fragment.kt
Activity.kt
ʊਓਓਓਓਓਓਓਓਓਓਓʊʼɹ͜͜Ͱ֬ೝͷϏϧυɹʻʉY^Y^Y^Y^Y^Y^Y^Yʉ
σόοάϝχϡʔ• ҙͷը໘Λϝχϡʔ͔Β ։͚ΔΑ͏ʹ͍ͯ͠Δɻ• ͱΓ͋͑ͣ࡞ͬͨը໘Λ ͙͢ʹ։͍ͯ֬ೝ͍ͨ࣌͠ʹ ศརɻ
Զͷίʔυͷॻ͖ॱ·ͱΊ
σʔλऔಘɺϨΠΞτදࣔͷͲͪΒ͔Βઌʹ࣮͢Δ͔APIͱσβΠϯͲͪΒ͕ઌߦ͍ͯ͠Δ͔࣍ୈ
Ϗϧυ͕͍ͷͰσʔλऔಘ෦Ұؾʹॻ͘
දࣔ෦ViewModelͷϓϩύςΟͱΞΫγϣϯʹཧͯ͠ॻ͘
DataBindingͰͭͳ͛ͯϏϧυͯ͠ΈͯΤϥʔ͕ग़ͳ͍͜ͱΛفΔ
ίʔυͷॻ͖ํਓͦΕͧΕ
ઃܭ͞ΕͨΞϓϦͷίʔυΛ࣮ࡍʹͲ͏ॻ͍͍ͯΔͷ͔ͱ͍͏հͰͨ͠
͋Γ͕ͱ͏͍͟͝·ͨ͠