Kotlin MVP Demo

作者: lkmc2 | 来源:发表于2018-02-28 13:59 被阅读96次

MVP是一种设计模式,将项目分为Model、View、Presenter三个模块,利用中间层Presenter完成View层与Model层的数据交互。

以下是各层的功能:
1.Model层:业务逻辑和实体模型。
2.View层:对应Activity,负责View的绘制以及与用户交互。
3.Presenter层:负责完成View与Model层的交互。

Model层

OnLoginFinishedListener.kt

package linchange.com.kotlinmvp.model

/**
 * Created by lkmc2 on 2018/2/28.
 * 登陆结束监听器
 */
interface OnLoginFinishedListener {
    fun onUsernameError() //用户名输入错误
    fun onPasswordError() //密码输入错误
    fun onSuccess() //登陆成功
}

LoginModel.kt

package linchange.com.kotlinmvp.model

/**
 * Created by lkmc2 on 2018/2/28.
 * 登陆模型(Model层)
 */
interface LoginModel {
    /**
     * 登陆
     * @param username 用户名
     * @param password 密码
     * @param listener 登陆结束监听器
     */
    fun login(username: String, password: String, listener: OnLoginFinishedListener)
}

LoginModelImpl.kt

package linchange.com.kotlinmvp.model

import android.os.Handler
import android.text.TextUtils

/**
 * Created by lkmc2 on 2018/2/28.
 * 登陆模型实现类(延迟2秒后登陆,用户名和密码非空则登陆成功)
 */
class LoginModelImpl : LoginModel {
    override fun login(username: String, password: String, listener: OnLoginFinishedListener) {
        Handler().postDelayed({
            var error = false //登陆失败标记
            if (TextUtils.isEmpty(username)) { //用户名为空
                listener.onUsernameError() //用户名输入错误
                error = true
            }
            if (TextUtils.isEmpty(password)) { //密码为空
                listener.onPasswordError() //密码输入错误
                error = true
            }
            if (!error) {
                listener.onSuccess() //登陆成功
            }
        }, 2000)
    }

}

View层

LoginView.kt

package linchange.com.kotlinmvp.view

/**
 * Created by lkmc2 on 2018/2/28.
 * 登陆界面接口(View层)
 */
interface LoginView {
    fun showProgress() //展示进度条
    fun hideProgress() //隐藏进度条
    fun setUsernameError() //设置用户名错误
    fun setPasswordError() //设置密码错误
    fun navigateToHome() //导航到桌面
}

MainActivity.kt

package linchange.com.kotlinmvp

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import kotlinx.android.synthetic.main.activity_main.*
import linchange.com.kotlinmvp.presenter.LoginPresenter
import linchange.com.kotlinmvp.presenter.LoginPresenterImpl
import linchange.com.kotlinmvp.view.LoginView
import org.jetbrains.anko.toast

/**
 * 主界面Activity(View层)
 */
class MainActivity : AppCompatActivity(),
        LoginView, View.OnClickListener { //实现Login和OnClickListener接口

    private lateinit var  presenter: LoginPresenter //登陆Presenter(延迟初始化)

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

        button.setOnClickListener(this) //为按钮设置点击事件监听器

        presenter = LoginPresenterImpl(this) //初始化presenter
    }

    override fun showProgress() {
        progress.visibility = View.VISIBLE //显示进度条
    }

    override fun hideProgress() {
        progress.visibility = View.GONE //隐藏进度条
    }

    override fun setUsernameError() {
        username.error = "用户名错误" //给用户名输入框设置错误信息
    }

    override fun setPasswordError() {
        password.error = "密码错误" //给密码输入框设置错误信息
    }

    override fun navigateToHome() {
        toast("登陆成功") //提示登陆成功
    }

    override fun onClick(v: View?) {
        //验证用户信息
        presenter.validateUserInfo(username.text.toString(), password.text.toString())
    }
}

Presenter层

LoginPresenter.kt

package linchange.com.kotlinmvp.presenter

/**
 * Created by lkmc2 on 2018/2/28.
 * 登陆Presenter(Presenter层)
 */
interface LoginPresenter {
    /**
     * 验证用户信息
     * @param username
     * @param password
     */
    fun validateUserInfo(username:String,password:String)

    fun onDestroy() //销毁view
}

LoginPresenterImpl.kt

package linchange.com.kotlinmvp.presenter

import linchange.com.kotlinmvp.model.LoginModel
import linchange.com.kotlinmvp.model.LoginModelImpl
import linchange.com.kotlinmvp.model.OnLoginFinishedListener
import linchange.com.kotlinmvp.view.LoginView

/**
 * Created by lkmc2 on 2018/2/28.
 * 登陆Presenter实现类
 */
class LoginPresenterImpl(private var loginView: LoginView?) : LoginPresenter, OnLoginFinishedListener {
    //loginView是登陆界面

    private val loginModel : LoginModel //登陆模型

    init {
        this.loginModel = LoginModelImpl() //实例化登陆模型
    }

    override fun validateUserInfo(username: String, password: String) {
        loginView?.showProgress() //显示进度条
        loginModel.login(username,password, this) //使用用户名和密码登陆
    }

    override fun onDestroy() {
        this.loginView = null //销毁登陆界面
    }

    override fun onUsernameError() {
        loginView?.apply { //登陆界面非空,操作loginView中的方法
            setUsernameError() //设置用户名错误
            hideProgress() //隐藏进度条
        }
    }

    override fun onPasswordError() {
        loginView?.apply { //登陆界面非空,操作loginView中的方法
            setPasswordError() //设置密码错误
            hideProgress() //隐藏进度条
        }
    }

    override fun onSuccess() {
        loginView?.apply { //登陆界面非空,操作loginView中的方法
            navigateToHome() //回到主界面
            hideProgress() //隐藏进度条
        }
    }

}
登陆失败运行截图.png
登陆成功运行截图.png

本项目的地址:https://github.com/lkmc2/KotlinMVP

相关文章

网友评论

    本文标题:Kotlin MVP Demo

    本文链接:https://www.haomeiwen.com/subject/xabbxftx.html