$30 off During Our Annual Pro Sale. View Details »

Google I/O 2018’s Extensions🦔

Hunachi
September 20, 2018

Google I/O 2018’s Extensions🦔

Kotlin大好き!Kotlin愛好会 vol4で発表しました.
是非Googleさんを参考にしましょう!

Hunachi

September 20, 2018
Tweet

More Decks by Hunachi

Other Decks in Technology

Transcript

  1. ˏ)VOBDIJ
    ,PUMJOѪ޷ձWPM
    (PPHMF*0`T
    &YUFOTJPOT

    View Slide

  2. ࣗݾ঺հ
    ;ͳͪ
    ߴઐ೥ੜ
    (JU)VC!)VOBDIJ
    5XJUUFS!@IVOBDIJ
    ,PUMJOΛॻ͖࢝Ί͔ͯΒϓϩάϥϛϯά͕޷͖ʹͳͬͨɽ
    ࠓ͸8BOUFEMZ*OD͞ΜͷݩͰΠϯλʔϯதͰ͢ʗʢ,PUMJOಋೖ͠·ͨ͠ʣ

    View Slide

  3. $PEFɿIUUQTHJUIVCDPNHPPHMFJPTDIFE
    0⒏DJBM#MPHɿIUUQTNFEJVNDPNBOESPJEEFWFMPQFSTHPPHMFJPBQQ
    BSDIJUFDUVSFBOEUFTUJOHGFGDFC
    (PPHMF*0BQQ

    View Slide

  4. w ,PUMJO
    w ࠓ೥͸ྫ೥ΑΓσεϚͯ͠ͳͦ͞͏ ʢ$POUSJCVUJPO਺͚ͩͰ͸ݴ͑ͳ͍͔΋
    ͚ͩͲʣ

    View Slide

  5. 6TFE5PPMBOE-JCSBSZ
    w 'JSF4UPSFɼ'JSF#BTF"VUIFOUJDBUJPO
    w "OESPJEY
    w %BHHFSɼ5JNCFSɼ(TPOɼ5ISFF5FOɼ$SBTIMZUJDTɼ(MJEFɼ&TQSFTTPɼ
    .PDLJUPɼ+6OJUɼMFBLDBOBSZɽ

    View Slide

  6. "SDIJUFDUVSF
    w $MFBO"SDIJUFDUVSF
    w 1SFTFOUBUJPOɿ7JFXˍ7JFX.PEFM
    w %PNBJOɿ6TF$BTF
    w %BUBɿ3FQPTJUPSZ 6TFS.BOBHFS
    w .77.

    View Slide

  7. View Slide

  8. &YUFOTJPOT
    /PUBMM FYUFOTJPOTPG
    NZGBWPSJUF

    View Slide

  9. // Listͱ͔ͰView͕ΨλϯͬͯͳͬͨΓ͢ΔͷΛ๷͙༻ɽ
    inline fun T.executeAfter(block: T.() ->Unit){
    block()
    // ͙͢ʹbinding͍ͤͨ࣌͞ʹ࢖͏ɽ
    executePendingBindings()
    }
    // ࢖༻ྫ
    binding.executeAfter {
    //͜͜Ͱbind͢Δɽ
    event = item
    }

    View Slide

  10. // TransitionΛ஗Ԇͤ͞Δ
    fun Activity.postponeEnterTransition(timeout: Long) {
    postponeEnterTransition()
    window.decorView.postDelayed(timeout) {
    startPostponedEnterTransition()
    }
    }
    // ࢖༻ྫ
    activity?.postponeEnterTransition(500L)

    View Slide

  11. // ॳظԽɼࢀর͕ৗʹγϯάϧεϨουͰ͔͠ߦΘΕͳ͍࣌༻ɽ
    fun lazyFast(operation: () -> T): Lazy =
    lazy(LazyThreadSafetyMode.NONE) {
    operation()
    }
    // SYNCRONIZED: σϑΥϧτɽ୯ҰεϨου͔ΒͷॳظԽͰɼෳ਺εϨου͔Βͷࢀর͕Մೳɽ
    // PUBLICATION: ෳ਺εϨου͔ΒॳظԽ͠Α͏ͱ͢Δࣄ͕Մೳɽ
    // ࢖༻ྫ
    private val day: Int by lazyFast {
    val args = arguments ?: throw
    IllegalStateException("Missing arguments!")
    args.getInt(ARG_INT)
    }

    View Slide

  12. inline fun
    FragmentActivity.viewModelProvider(
    provider: ViewModelProvider.Factory
    ) =
    ViewModelProviders.of(this, provider).get(VM::class.java)
    // ࢖༻ྫ
    // Before
    val viewModel: HogeViewModel =
    ViewModelProviders.of(this, viewModelFactory)
    .get(HogeViewModel::class.java)
    //After
    val viewModel: HogeViewModel =
    viewModelProvider(viewModelFactory)

    View Slide

  13. fun ViewGroup.inflate(
    @LayoutRes layout: Int, attachToRoot: Boolean = false
    ): View {
    return LayoutInflater.from(context)
    .inflate(layout, this, attachToRoot)
    }
    // ࢖༻ྫ

    Holder(
    parent.inflate(VIEW_TYPE_HEADING, false)
    )

    View Slide

  14. inline fun FragmentManager.inTransaction(
    func: FragmentTransaction.() -> FragmentTransaction
    ) {
    beginTransaction().func().commit()
    }
    // ࢖༻ྫ
    supportFragmentManager.inTransaction {
    add(FRAGMENT_ID, fragment)
    }

    View Slide

  15. // enumΫϥεΛbundleʹೖΕΕΔܗʹ͢Δ
    fun > Bundle.putEnum(key: String, value: T) =
    putString(key, value.name)
    // ↑ͰೖΕͨenumΫϥεΛऔΓग़͢
    inline fun > Bundle.getEnum(key: String):
    T = enumValueOf(getString(key))
    // ParcelʹbooleanΛॻ͖ࠐΉ
    fun Parcel.writeBoolean(value: Boolean) = writeInt(if (value)
    1 else 0)
    // ↑Ͱม׵ͨ͠booleanΛಡΈࠐΉ
    fun Parcel.readBoolean() = readInt() != 0

    View Slide

  16. // ࢖༻ྫ
    // ಡΈ΍͍͢ʂ
    pacel.apply {
    writeInt(state)
    writeInt(peekHeight)
    writeBoolean(isFitToContents)
    writeBoolean(isHideable)
    writeBoolean(skipCollapsed)
    writeBoolean(isDraggable)
    }

    View Slide

  17. fun MutableLiveData.setValueIfNew(newValue: T) {
    if (this.value != newValue) value = newValue
    }
    fun MutableLiveData.postValueIfNew(newValue: T) {
    if (this.value != newValue) postValue(newValue)
    }
    // ObserverଆͰ൑ఆͨ͠ํ͕҆શͳؾ͕͢Δ͚ͲͲ͏ͳΜͩΖ͏ɽɽ

    View Slide

  18. fun LiveData.map(body: (X) -> Y): LiveData {
    return Transformations.map(this, body)
    }
    fun LiveData.switchMap(body: (X) -> LiveData):
    LiveData {
    return Transformations.switchMap(this, body)
    }

    View Slide

  19. // ࢖༻ྫ
    liveData = parentLiveData.map {
    (it as? Result.Success)?.data?: 0
    }
    liveData = parentLiveData.switchMap {
    if(value == null) dataLiveData else parentLiveData
    }
    // ࠷ॳ֦ுؔ਺ͬͯࣄʹؾ͔ͮͣɼڻ͍ͨɽ

    View Slide

  20. val T.checkAllMatched: T
    get() = this
    // ࢖༻ྫ
    // OK
    when (sealed) {
    ONE -> {…}
    TWO -> {…}
    }.checkAllMatch
    // error
    when (sealed) {
    ONE -> {…}
    //TWO -> {…}
    }.checkAllMatch

    View Slide

  21. w
    ௒ஸೡʂ
    ͜ͷ࣮૷͸७ਮʹ಄
    ͍͍ͱࢥ͏ɽ

    View Slide

  22. 5IBOLZPV
    ,PUMJOՄѪ͍ʂ

    View Slide