Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Delegated propertyで Android開発をもっと便利に @ Gunosy Beer Bash #12

Delegated propertyで Android開発をもっと便利に @ Gunosy Beer Bash #12

chibatching

June 14, 2017
Tweet

More Decks by chibatching

Other Decks in Programming

Transcript

  1. %FMFHBUFEQSPQFSUZͰ
    "OESPJE։ൃΛ΋ͬͱศརʹ

    (VOPTZ#FFS#BTI
    גࣜձࣾτΫόΠ
    ઍ༿ོ༤

    View Slide

  2. w ઍ༿ོ༤ !DIJCBUDIJOH

    w גࣜձࣾτΫόΠ
    w "OESPJEΤϯδχΞ
    ࣗݾ঺հ

    View Slide

  3. w /VMM҆શ
    w ֦ுؔ਺
    w WBSWBM
    ,PUMJOͱ͍͑͹ʁ

    View Slide

  4. w /VMM҆શ
    w ֦ுؔ਺
    w WBSWBM
    w %FMFHBUFE1SPQFSUZ
    ,PUMJOͱ͍͑͹ʁ

    View Slide

  5. %FMFHBUFE1SPQFSUZ

    View Slide

  6. w ϓϩύςΟͷHFUUFSTFUUFSॲཧΛ
    ผͷΫϥεΦϒδΣΫτʹҕৡͰ͖Δ
    ࢓૊Έ
    w CZΩʔϫʔυͰҕৡઌΛࢦఆ͢Δ
    %FMFHBUFE1SPQFSUZ

    View Slide

  7. ҕৡ͢Δଆ
    var foo1: String by Foo()
    var foo2: String by getFoo()
    fun getFoo() = Foo()
    fun main(vararg args: String) {
    var foo2: String by getFoo()
    }
    CZͷޙΖʹҕৡઌͷ
    ΫϥεΠϯελϯε

    View Slide

  8. ҕৡ͢Δଆ
    var foo1: String by Foo()
    var foo2: String by getFoo()
    fun getFoo() = Foo()
    fun main(vararg args: String) {
    var foo2: String by getFoo()
    }
    CZͷޙΖʹҕৡઌͷ
    ΫϥεΠϯελϯε
    ҕৡઌΛฦ͢
    ؔ਺Ͱ΋Մ

    View Slide

  9. ҕৡ͞ΕΔଆ
    var foo1: String by Foo()
    var foo2: String by getFoo()
    fun getFoo() = Foo()
    fun main(vararg args: String) {
    var foo2: String by getFoo()
    }
    CZͷޙΖʹҕৡઌͷ
    ΫϥεΠϯελϯε
    ҕৡઌΛฦ͢
    ؔ਺Ͱ΋Մ
    ,PUMJO͔Β͸
    ϩʔΧϧม਺Ͱ΋ར༻Մೳʹʂ

    View Slide

  10. ҕৡ͞ΕΔଆ
    class Foo {
    operator fun getValue(thisRef: Any?,
    property: KProperty<*>): String {
    return "get value through delegation"
    }
    operator fun setValue(thisRef: Any?,
    property: KProperty<*>,
    value: String) {
    Log.d(TAG, "set value $value through delegation")
    }
    }

    View Slide

  11. ҕৡ͞ΕΔଆ
    class Foo {
    operator fun getValue(thisRef: Any?,
    property: KProperty<*>): String {
    return "get value through delegation"
    }
    operator fun setValue(thisRef: Any?,
    property: KProperty<*>,
    value: String) {
    Log.d(TAG, “set value $value through delegation")
    }
    } HFU7BMVF TFU7BMVF
    PQFSBUPSΛ࣮૷

    View Slide

  12. ҕৡ͞ΕΔଆ
    class Foo : ReadWriteProperty {
    override fun getValue(thisRef: Any?,
    property: KProperty<*>): String {
    return "get value through delegation"
    }
    override fun setValue(thisRef: Any?,
    property: KProperty<*>,
    value: String) {
    Log.d(TAG, "set value $value through delegation")
    }
    } ΠϯλʔϑΣʔεΛ
    ࣮૷͢Δͱগָ͠

    View Slide

  13. HFUUFSTFUUFSͷ
    ΧελϚΠζͱԿ͕ҧ͏ͷʁ

    View Slide

  14. %FMFHBUFEQSPQFSUZ
    class Foo {
    operator fun getValue(thisRef: Any?,
    property: KProperty<*>): String {
    return "get value through delegation"
    }
    operator fun setValue(thisRef: Any?,
    property: KProperty<*>,
    value: String) {
    Log.d(TAG, “set value $value through delegation")
    }
    }

    View Slide

  15. HFUUFSTFUUFS
    var foo: String
    get() = "get value through getter"
    set(value) {
    Log.d(TAG, "set value $value through delegation")
    }

    View Slide

  16. HFUUFSTFUUFS
    ࣮૷ͷ΄͏͕ѹ౗తʹ؆୯

    View Slide

  17. %FMFHBUFE1SPQFSUZΛ
    ࢖͏΂͖৔໘

    View Slide

  18. w ڞ௨ԽͰ͖Δॲཧ
    w ෳࡶͳঢ়ଶΛอ͍࣋ͨ͠
    w ෳࡶͳॲཧΛ͍ͨ͠
    w ΍Γա͗஫ҙ
    %FMFHBUF1SPQFSUZΛ࢖͏΂͖৔໘

    View Slide

  19. ڞ௨Խͯ͠੾Γग़ͯ͠
    ҕৡݩ΍ϓϩύςΟͷ৘ใ͕
    Θ͔Βͳ͘ͳΒͳ͍ʁ

    View Slide

  20. w ҕৡݩΫϥεͷऔಘɾ੍ݶ
    w ϓϩύςΟͷϝλσʔλࢀর
    %FMFHBUF1SPQFSUZͰͰ͖Δ͜ͱ

    View Slide

  21. ϓϩύςΟͷϝλσʔλ
    class Foo {
    operator fun getValue(thisRef: Any?,
    property: KProperty<*>): String {
    return "get value through delegation"
    }
    operator fun setValue(thisRef: Any?,
    property: KProperty<*>,
    value: String) {
    Log.d(TAG, "set value $value through delegation")
    }
    } ҕৡݩͷϓϩύςΟ͕ଐ͢ΔΫϥε
    ܕͰ੍ݶ͢Δ͜ͱ΋Մೳ

    View Slide

  22. ϓϩύςΟͷϝλσʔλ
    class Foo {
    operator fun getValue(thisRef: Any?,
    property: KProperty<*>): String {
    return "get value through delegation"
    }
    operator fun setValue(thisRef: Any?,
    property: KProperty<*>,
    value: String) {
    Log.d(TAG, "set value $value through delegation")
    }
    } ҕৡݩͷϓϩύςΟͷ
    ϝλσʔλΛࢀরՄೳ

    View Slide

  23. ϓϩύςΟͷϝλσʔλ
    class Bar {

    operator fun provideDelegate(thisRef: Any?,
    property: KProperty<*>): ReadOnlyProperty {
    return this
    }
    }
    ,PUMJO͔Β͸
    ҕৡΛఏڙͨ͠
    λΠϛϯάͰݺ͹ΕΔ
    PQFSBUPS͕௥Ճ͞Εͨ

    View Slide

  24. ϓϩύςΟͷϝλσʔλ
    class Sample {
    var bar: String by Bar()
    }
    ΫϥεͷΠϯελϯεΛ
    ੜ੒ͨ͠ஈ֊ͰϓϩύςΟͷ৘ใΛ
    ಘΒΕΔΑ͏ʹͳͬͨ

    View Slide

  25. w HFUUFSTFUUFSͷΧελϚΠζͰ

    े෼ͳ৔໘͕ଟ͍
    w ඪ४ϥΠϒϥϦ΍αʔυύʔςΟͷ

    ϥΠϒϥϦΛ༗ޮ׆༻͢Δ
    %FMFHBUFE1SPQFSUZΛ࣮૷͢Δ͔

    View Slide

  26. "OESPJEͰ
    %FMFHBUFE1SPQFSUZ

    View Slide

  27. ඪ४ϥΠϒϥϦ

    View Slide

  28. MB[Z

    View Slide

  29. w ϓϩύςΟʹॳΊͯΞΫηεͨ࣌͠ʹ
    ϒϩοΫͷ಺༰Λ࣮ߦ
    w ࠷ऴߦͷ஋͕ճ໨Ҏ߱ͷ

    ΞΫηεͰ͸࢖ΘΕΔ
    MB[Z

    View Slide

  30. w "OESPJEʹ͸ίϯετϥΫλͰ

    ॳظԽͰ͖ͳ͍΋ͷ͕ଟ͍
    w FY
    "DUJWJUZͷPO$SFBUFҎ߱ʹΞ
    ΫηεՄೳͳ΋ͷ
    w *OUFOU
    w γεςϜαʔϏε
    w FUDʜ
    MB[Z

    View Slide

  31. MB[Z
    var param: String? = null
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    param = intent.getStringExtra("param")
    Log.d(TAG, param)
    } ,PUMJOͷϓϩύςΟ͸
    ॳظ஋͕ඞཁ

    View Slide

  32. lateinit var param: String
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    param = intent.getStringExtra("param")
    Log.d(TAG, param)
    }
    MB[Z
    MBUFJOJUͰॳظ஋ෆཁʹͰ͖Δ

    View Slide

  33. lateinit var param: String
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    param = intent.getStringExtra("param")
    Log.d(TAG, param)
    }
    MB[Z
    Ͱ΋Ұ౓୅ೖͨ͠Βมߋ͢Δඞཁ͕
    ͳ͍ͷʹWBSʹ͢Δͷ͸ؾ࣋ͪѱ͍ʜ

    View Slide

  34. val param: String by lazy { intent.getStringExtra("param") }
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    Log.d(TAG, param)
    }
    MB[Z
    Πϯελϯεੜ੒࣌ʹ͸࣮ߦ͞Εͳ͍
    WBMͰએݴ

    View Slide

  35. val param: String by lazy { intent.getStringExtra("param") }
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    Log.d(TAG, param)
    }
    MB[Z
    ࠷ॳʹΞΫηεͨ࣌͠ʹॳΊͯॳظԽ

    View Slide

  36. w ϥΠϑαΠΫϧʹ஫ҙ͕ඞཁ
    w ಛʹ'SBHNFOU
    MB[Z

    View Slide

  37. PCTFSWBCMFWFUPBCMF

    View Slide

  38. w ϓϩύςΟͷมߋΛݕ஌
    w WFUPBCMFͰ͸มߋΛड͚ೖΕΔ͔

    ൑ఆ͢Δ͜ͱ͕Ͱ͖Δ
    PCTFSWBCMFWFUPBCMF

    View Slide

  39. w XBZ%BUB#JOEJOHͱ

    ૬ੑ͕ྑͦ͞͏
    PCTFSWBCMFWFUPBCMF

    View Slide

  40. w &EJU5FYUʹԿ͔ೖྗ͞Ε͍ͯͨΒ

    ૹ৴ϘλϯΛ༗ޮʹ͢Δ
    PCTFSWBCMFWFUPBCMF

    View Slide

  41. PCTFSWBCMFWFUPBCMF
    class ViewModel {
    var inputText: String by Delegates.observable("")
    { property, oldValue, newValue ->
    buttonEnabled.set(newValue.isNotEmpty())
    }
    var buttonEnabled = ObservableBoolean(false)
    }
    ςΩετ͕ۭͰͳ͚Ε͹ϘλϯΛ༗ޮʹ͢Δ
    %FMFHBUFE1SPQFSUZͷػೳ

    View Slide

  42. PCTFSWBCMFWFUPBCMF
    class ViewModel {
    var inputText: String by Delegates.observable("")
    { property, oldValue, newValue ->
    buttonEnabled.set(newValue.isNotEmpty())
    }
    val buttonEnabled = ObservableBoolean(false)
    }
    Ϙλϯͷ༗ޮແޮΛ%BUB#JOEJOHʹ௨஌͢Δ
    %BUB#JOEJOHͷػೳ

    View Slide

  43. PCTFSWBCMFWFUPBCMF





    android:hint="Please input some text"
    android:text="@={viewModel.inputText}"
    />
    android:enabled="@{viewModel.buttonEnabled}"
    android:text="Send"
    />


    View Slide

  44. PCTFSWBCMFWFUPBCMF





    android:hint="Please input some text"
    android:text="@={viewModel.inputText}"
    />
    android:enabled="@{viewModel.buttonEnabled}"
    android:text="Send"
    />


    View Slide

  45. PCTFSWBCMFWFUPBCMF
    class MainActivity : AppCompatActivity() {
    val binding by lazy {
    DataBindingUtil.setContentView(
    [email protected], R.layout.activity_main)
    }
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding.viewModel = ViewModel()
    }
    }

    View Slide

  46. PCTFSWBCMFWFUPBCMF

    View Slide

  47. αʔυύʔςΟ
    ϥΠϒϥϦ

    View Slide

  48. ,PUUFS,OJGF
    IUUQTHJUIVCDPN+BLF8IBSUPOLPUUFSLOJGF

    View Slide

  49. w #VUUFS,OJGFͷ+BLFۘ੡
    w #VUUFS,OJGFͷ,PUMJOόʔδϣϯ
    ,PUUFS,OJGF

    View Slide

  50. ,PUUFS,OJGF
    val firstName: TextView by bindView(R.id.first_name)
    val lastName: TextView by bindView(R.id.last_name)
    // Optional binding.
    val details: TextView? by bindOptionalView(R.id.details)

    View Slide

  51. w ࣮૷͸#VUUFS,OJGFLUͷ

    ϑΝΠϧͷΈ
    w ࣗ࡞%FMFHBUFE1SPQFSUZͷ

    ࠷ॳͷษڧʹͪΐ͏ͲΑ͍
    w 'SBHNFOUͰ࢖͏ͱ͖͸஫ҙ͕ඞཁ
    w %BUB#JOEJOH࢖͍ͬͯΕ͹

    ΋͏ඞཁ͸ͳ͍ʜ
    ,PUUFS,OJGF

    View Slide

  52. ,PUQSFG
    IUUQTHJUIVCDPNDIJCBUDIJOH,PUQSFG

    View Slide

  53. w 4IBSFE1SFGFSFODFͷѻ͍Λ؆୯ʹ
    ͢ΔͨΊͷϥΠϒϥϦ
    w ࢲ͕࡞Γ·ͨ͠#
    ,PUQSFG

    View Slide

  54. ,PUQSFG
    object UserInfo : KotprefModel() {
    var name by stringPref()
    var age by intPref(default = 14)
    }
    fun save(name: String, age: Int) {
    UserInfo.name = name
    UserInfo.age = age
    }
    fun show() {
    nameTextView.text = UserInfo.name
    ageTextView.text = UserInfo.age
    }
    1SFGFSFODFͷΩʔ͸
    ࢦఆෆཁ

    View Slide

  55. ,PUQSFG
    UserInfo.xml


    chibatching


    ϓϩύςΟ໊ΛΩʔʹͯ͠อଘ
    Ϋϥε໊ͷ9.-Λੜ੒

    View Slide

  56. w ϓϩύςΟ໊͕Ωʔ஋ʹͳΔ
    w Ωʔ஋ͷ؅ཧΛTUSJOHϦιʔε΍ఆ
    ਺ΫϥεͰ͠ͳ͍͍͘
    ,PUQSFG

    View Slide

  57. w ,PEFJO
    w %*ϥΠϒϥϦ
    w SFNPUFLPOpH
    w 'JSFCBTF3FNPUF$POpHͷσʔλΞΫηε
    ΄͔ʹ΋ʜ
    IUUQTHJUIVCDPN4BMPNPO#SZT,PEFJO
    IUUQTHJUIVCDPNDIJCBUDIJOHSFNPUFLPOpH

    View Slide

  58. w %FMFHBUFE1SPQFSUZ͸ෳࡶͳ

    ϓϩύςΟͷΞΫηεॲཧΛ

    ࣮ݱͰ͖Δ
    w ैདྷͳΒ"OOPUBUJPO1SPDFTTPSͰ΍ͬͯ
    ͍ͨΑ͏ͳ͜ͱ΋৔߹ʹΑͬͯ͸Մೳ
    w HFUUFSTFUUFSͷΧελϚΠζ΍

    ϥΠϒϥϦͷ׆༻ͱ߹Θͤͯݕ౼
    ·ͱΊ

    View Slide