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"
}