I setup my project to MVP architecture. I was able to setup MVP for MainActivity and ListAdapter. Basically I have a list of images in ListAdapter, when item clicked, it will start PhotoDetailActivity which I've setup Presenter and View already.
ListAdapter.kt (Full gist here)
override fun onBindViewHolder(holder: ListViewHolder, position: Int) {
val photo = photos[position]
holder.bind(photo)
holder.itemLayout.setOnClickListener {
listener.itemDetail(photo.id)
}
Glide
.with(context)
.load(photo.urls.regular)
.into(holder.photo)
Glide
.with(context)
.load(photo.user.profile_image.small)
.into(holder.userAvatar)
}
PhotoDetailActivity.kt (Full gist here)
lateinit var presenter: PhotoDetailContract.Presenter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_photo_detail)
var photoId: String = intent.getStringExtra("photoId")
injectDependency()
presenter.attach(this)
initView(photoId)
}
But it said that:
kotlin.UninitializedPropertyAccessException: lateinit property presenter has not been initialized
My full code is here
declaring the member like this:
lateinit var presenter: PhotoDetailContract.Presenter
..inidicates that this reference will be initialized at some point after the constructor has run. however, you don't seem to have any code instrumented to do so. having glanced at your project, i think what you might have meant was for Dagger to inject that that instance. to do so, you need to add the @Inject annotation, like so:
@Inject lateinit var presenter: PhotoDetailContract.Presenter
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With