mpao
9/17/2017 - 10:50 AM

Android Architecture Components with Dagger ( Kotlin )

Android Architecture Components with Dagger ( Kotlin )

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // factory necessaria per creare VM con parametri
        // leggi anche https://goo.gl/xAjs9B
        val factory = MyViewModelFactory("marco") // usa dagger per DI

        val viewModel = ViewModelProviders.of(this,factory).get(MyViewModel::class.java)
        viewModel.data?.observe(this, Observer { data ->
            Log.i("test", data)
        })
    }
}
class MyViewModel constructor(id: String): ViewModel() {

    var data: LiveData<String>? = null
    private val repo: Repos by lazy { App.component.providesRepos() } /* return a ReposImpl with DI */

    init {
        this.data = repo.get(id)
    }

}
class MyViewModelFactory constructor(var id: String): ViewModelProvider.Factory {

    init {
        this.id = id
    }

    @Suppress("UNCHECKED_CAST")
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {

        if ( modelClass.isAssignableFrom(MyViewModel::class.java) ){
            return MyViewModel(this.id) as T
        }
        throw IllegalArgumentException("Unknown ViewModel class")
    }
}
interface Repos {

    fun get( id: String ): LiveData<String>

}
class ReposImpl: Repos {

    private var data = MutableLiveData<String>()

    override fun get( id: String ): LiveData<String> {

        Handler().postDelayed({
            data.value = "Hello $id"
        }, 5000)

        return data

    }
}

/* 
https://developer.android.com/topic/libraries/architecture/adding-components.html

remember to add

maven { url 'https://maven.google.com' } // <- ADD

as repositories in gradle
*/
ext.aac         = "???"

dependencies {
    ...
    // For Lifecycles, LiveData, and ViewModel
    compile "android.arch.lifecycle:extensions:$aac"
    implementation "android.arch.lifecycle:common-java8:$aac"
}