abstract class BasePresenter<T : IView> : IPresenter {
var mView: WeakReference<T>? = null
override fun attachView(view: IView) {
mView = WeakReference(view as T)
}
override fun detachView() {
mView = null
}
}
#注意:此处使用星投影为了避免具体的Presenter无边界报错
abstract class BaseActivity<P : BasePresenter<*>> : AppCompatActivity(), IView {
lateinit var mPresenter: P
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(onLayout())
mPresenter = initPresenter()
mPresenter.attachView(this)
onCreated(savedInstanceState)
}
override fun providerContext(): Context {
return this
}
override fun onDestroy() {
super.onDestroy()
mPresenter.detachView()
}
abstract fun onLayout() : Int
abstract fun initPresenter() : P
abstract fun onCreated(savedInstanceState: Bundle?)
}
具体实例
#此处以用户类为例
#用户Bean
data class User(val userName: String, val password: String)
#我们使用一个契约接口,对具体的某个逻辑的model,view和presenter进行封装
interface UserContract{
interface View : IView{
fun showData(user: User)
}
interface Model: IModel{
fun loadData() : User
}
interface Presenter : IPresenter{
fun contract()
}
}
#用户Model,处理一些逻辑(获取用户名等)
class UserModel : UserContract.Model {
override fun loadData(): User {
return User("张三", "123456")
}
}
#用户Presenter
class UserPresenter : BasePresenter<UserContract.View>(), UserContract.Presenter {
val userModel : UserModel by lazy {
UserModel()
}
override fun contract() {
mView?.get()?.showData(userModel.loadData())
}
}
#用户界面
class UserActivity : BaseActivity<UserPresenter>(), UserContract.View {
var user: User? = null
override fun onLayout(): Int {
return R.layout.activity_user_layout
}
override fun onCreated(savedInstanceState: Bundle?) {
mPresenter.contract()
text_view.setOnClickListener { text_view.text = user?.userName }
}
override fun initPresenter(): UserPresenter {
return UserPresenter()
}
override fun showData(user: User) {
this.user = user
}
}
引言:本文主要介绍怎样通过Kotlin语音实现MVP框架,不再对Kotlin语法和MVP进行讲述.废话不多说,直接上代码:Base基础包#先定义抽象的三个接口,在接口中可以抽出公有的几个方法,根据自我需求随意发挥interface IView { fun providerContext(): Context}interface IPresenter { fun ...