icerockdev / moko-mvvm

Model-View-ViewModel architecture components for mobile (android & ios) Kotlin Multiplatform development
https://moko.icerock.dev/
Apache License 2.0
997 stars 95 forks source link

ViewBinding support out of box #76

Closed RezMike closed 3 years ago

RezMike commented 3 years ago

VBActivity:

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelProvider
import dev.icerock.moko.mvvm.viewmodel.ViewModel

abstract class VBActivity<VB : Any, VM : ViewModel> : AppCompatActivity() {

    protected lateinit var viewModel: VM
    protected lateinit var binding: VB

    protected abstract val viewModelClass: Class<VM>

    protected abstract fun viewModelFactory(): ViewModelProvider.Factory
    protected abstract fun viewBinding(layoutInflater: LayoutInflater): VB
    protected abstract fun VB.root(): View

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        viewModel = ViewModelProvider(this, viewModelFactory())[viewModelClass]
        binding = viewBinding(layoutInflater)

        setContentView(binding.root())
    }
}

VBEventsActivity:

import android.os.Bundle
import dev.icerock.moko.mvvm.dispatcher.EventsDispatcherOwner
import dev.icerock.moko.mvvm.viewmodel.ViewModel

abstract class VBEventsActivity<VB : Any, VM, Listener : Any> :
    VBActivity<VB, VM>() where VM: ViewModel, VM : EventsDispatcherOwner<Listener> {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        @Suppress("UNCHECKED_CAST")
        viewModel.eventsDispatcher.bind(this, this as Listener)
    }
}