kotlin实现 简单的MVP模式

最近学习了一下MVP模式。

我自己的理解是:

M:model 数据的处理:网络请求,读写文件等;

V:view 界面处理:Toast,EditText获取,界面跳转等;

P:presenter 协调V和M,调用M拿到数据,再调用View显示出对用的界面。


上代码:首先是目录



然后看看具体代码:

ILoginModel

package com.antiandi.android.mvpdemo.kotlin.mvp.model.imodel

/**
 * Created by wk on 2017/6/6.
 */
interface ILoginModel {
    fun login(userName : String,password : String,onLoginListener: OnLoginListener) : Unit
}


LoginModel

package com.antiandi.android.mvpdemo.kotlin.mvp.model.mod

import com.antiandi.android.mvpdemo.kotlin.mvp.model.imodel.ILoginModel
import com.antiandi.android.mvpdemo.kotlin.mvp.model.imodel.OnLoginListener

/**
 * Created by wk on 2017/6/6.
 */
class LoginModel : ILoginModel {
    companion object{
        private var mLoginModel : LoginModel ?= null
        fun newInstance() : LoginModel?{
            if (mLoginModel == null) mLoginModel = LoginModel()
            return mLoginModel
        }
    }
    override fun login(userName: String, password: String, onLoginListener: OnLoginListener) {
        if ("zhangsan" != userName) {
            onLoginListener.onUserNameError()
            return
        }
        if ("123" != password) {
            onLoginListener.onPasswordError()
            return
        }

        onLoginListener.onSuccess()
    }
}

ILoginListener:

package com.antiandi.android.mvpdemo.kotlin.mvp.model.imodel

/**
 * Created by wk on 2017/6/6.
 */
interface OnLoginListener {
    fun onUserNameError() : Unit
    fun onPasswordError() : Unit
    fun onSuccess() : Unit
    fun onError() : Unit
}


ILoginPresenter:

package com.antiandi.android.mvpdemo.kotlin.mvp.presenter.ipresenter

/**
 * Created by user on 2017/6/6.
 */
interface ILoginPresenter {
    fun login() : Unit
}

LoginPresenter:

package com.antiandi.android.mvpdemo.kotlin.mvp.presenter.compl

import com.antiandi.android.mvpdemo.kotlin.mvp.model.imodel.ILoginModel
import com.antiandi.android.mvpdemo.kotlin.mvp.model.imodel.OnLoginListener
import com.antiandi.android.mvpdemo.kotlin.mvp.model.mod.LoginModel
import com.antiandi.android.mvpdemo.kotlin.mvp.presenter.ipresenter.ILoginPresenter
import com.antiandi.android.mvpdemo.kotlin.mvp.view.iview.ILoginView

/**
 * Created by wk on 2017/6/6.
 */
class LoginPresenter(var mView : ILoginView,var mModel : ILoginModel ?) : ILoginPresenter , OnLoginListener{
//    var mView : ILoginView ?= null
//    var mModel : ILoginModel ?= LoginModel()

    override fun login() {
        var userName : String = mView!!.getUserName()
        var password : String = mView!!.getPassword()
        this.mModel!!.login(userName,password,this@LoginPresenter)
    }


    override fun onUserNameError() {
        mView!!.showToast("onUserNameError--->")
    }

    override fun onPasswordError() {
        mView!!.showToast("onPasswordError--->")
    }

    override fun onSuccess() {
        mView!!.showToast("onSuccess--->")
        mView!!.gotoMainActivity()
    }

    override fun onError() {
        mView!!.showToast("onError--->")
    }
}

ILoginView:

package com.antiandi.android.mvpdemo.kotlin.mvp.view.iview

/**
 * Created by wk on 2017/6/6.
 */
interface ILoginView {
    fun getUserName() : String
    fun getPassword() : String
    fun showToast(msg : String) : Unit
    fun gotoMainActivity() : Unit
}

LoginActivity:

package com.antiandi.android.mvpdemo.kotlin.mvp.view.activity

import android.content.Intent
import android.graphics.Color
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.Gravity
import android.view.View
import android.widget.EditText
import android.widget.LinearLayout
import android.widget.Toast
import com.antiandi.android.mvpdemo.MainActivity
import com.antiandi.android.mvpdemo.R
import com.antiandi.android.mvpdemo.kotlin.mvp.model.mod.LoginModel
import com.antiandi.android.mvpdemo.kotlin.mvp.presenter.compl.LoginPresenter
import com.antiandi.android.mvpdemo.kotlin.mvp.presenter.ipresenter.ILoginPresenter
import com.antiandi.android.mvpdemo.kotlin.mvp.view.iview.ILoginView
import org.jetbrains.anko.*

/**
 * Created by wk on 2017/6/6.
 */
class LoginActivity : AppCompatActivity() ,ILoginView{
    var mPresenter : LoginPresenter = LoginPresenter(this@LoginActivity,LoginModel.newInstance())
    var mUI : UI = UI()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mUI.setContentView(this@LoginActivity)
//        mPresenter.mView = this@LoginActivity
    }

    override fun getUserName(): String {
        return mUI.etUserName!!.text.toString()
    }

    override fun getPassword(): String {
        return mUI.etPassword!!.text.toString()
    }

    override fun showToast(msg: String) {
        toast(msg)
    }

    override fun gotoMainActivity() {
        startActivity(Intent(this@LoginActivity,MainActivity::class.java))
    }

    inner class UI : AnkoComponent<LoginActivity> {
        var etUserName : EditText ?= null
        var etPassword : EditText ?= null
        override fun createView(ui: AnkoContext<LoginActivity>): View {
            return with(ui){
                linearLayout {
                    lparams {
                        width = matchParent
                        height = wrapContent
                        orientation = LinearLayout.VERTICAL
                    }

                    etUserName = editText {
                        hint = "账号"
                        hintTextColor = Color.GRAY
                        lparams {
                            width = matchParent
                            height = wrapContent
                            margin = dip(50)
                        }
                    }

                    etPassword = editText {
                        hint = "密码"
                        hintTextColor = Color.GRAY
                        lparams {
                            width = matchParent
                            height = wrapContent
                            margin = dip(50)
                        }
                    }

                    button ("登录"){
                        onClick {
                            mPresenter.login()
                        }

                        lparams {
                            width = wrapContent
                            height = wrapContent
                            margin = dip(10)
                            setHorizontalGravity(Gravity.CENTER)
                        }
                    }
                }
            }
        }
    }
}

好啦,代码结束,自己觉得有争议的就是

1、LoginActivity里面Presenter的创建方式,觉得Presenter的构造方法可以是无参的,然后提供setView()方法将View注入到Presenter中。然后Model直接在Presenter里面创建即可。

2、LoginActivty里面的确定按钮的点击事件应该调用View本身的view.login(),然后在login()方法中去调用mPresenter.login(),这样会使IView中的接口更加统一。


关于kotlin的学习是偷偷摸摸学的,忘记了做记录。以后学习新的东西应该及时的记录下来,以免以后忘记。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值