Kotlin实战_写一个登录的Demo

前言

如何安装Kotlin可以参考Kotlin学习(一): Kotlin插件安装这篇文章。

demo说明

该demo是使用Kotlin写的登录demo,使用MVP模式,里面用到了Retrofit+RxJava,然后用了Mob的登录Api接口作为登录和注册的判断,Mob提供了很多免费的接口。

demo界面

Activity

直接将控件的id当成变量来使用
xml

设置点击事件

1
2
login.setOnClickListener(this)
register.setOnClickListener(this)

when代替switch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
override fun onClick(v: View?) {
when (v?.id) {
R.id.login ->
if (checkContent(true)) {
dialog = SweetAlertDialog(this, SweetAlertDialog.PROGRESS_TYPE)
.setTitleText("正在登录...")
dialog?.setCancelable(false)
dialog?.show()
loginPresenter?.login(username.text.toString(), password.text.toString())
}
R.id.register ->
if (checkContent(false)) {
dialog = SweetAlertDialog(this, SweetAlertDialog.PROGRESS_TYPE)
.setTitleText("正在注册...")
dialog?.setCancelable(false)
dialog?.show()
loginPresenter?.register(username.text.toString(), password.text.toString(), email.text.toString())
}
}
}

注意:直接使用id作为变量的时候,要在Modulegradle里面加入扩展,才能使用,不然会报错

1
apply plugin: 'kotlin-android-extensions'

Retrofit+RxJava

Retrofit结合RxJava能快捷的使用网络请求。
创建Service接口,Kotlin的类型是写在后面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
interface RetrofitService {

/**
* 注册
* key 用户申请的appkey
* username 用户名(一个key只能存在唯一username)
* password 用户密码(建议加密)
* email 邮箱
*/
@GET("rigister")
fun userRegister(
@Query("username") username: String,
@Query("password") password: String,
@Query("email") email: String,
@Query("key") key: String = Constant.KEY
): Observable<RegisterResponse>

/**
* 登录
* key 用户申请的appkey
* username 用户名
* password 用户密码
*/
@GET("login")
fun userLogin(
@Query("username") username: String,
@Query("password") password: String,
@Query("key") key: String = Constant.KEY
): Observable<LoginResponse>

}

创建Retrofit,使用伴生对象创建,类型静态变量使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

class RetrofitUtils<T> {
companion object {
/**
* 创建Retrofit
*/
fun create(url: String): Retrofit {
...
return Retrofit.Builder()
.baseUrl(url)
.client(okHttpClientBuilder.build())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
}

val retrofitService: RetrofitService = RetrofitUtils.getService(Constant.REQUEST_BASE_URL, RetrofitService::class.java)

/**
* 获取ServiceApi
*/
fun <T> getService(url: String, service: Class<T>): T {
return create(url).create(service)
}
}
}

Retrofit结合RxJava

1
2
3
4
5
6
7
8
9
RetrofitUtils
.retrofitService
.userLogin(username, password)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
...
})

使用对象声明

在写项目的时候,一般会将常量统一写到一个类里面,然后设置静态变量,由于在Kotlin中不存在静态变量,所有就有对象声明的存在,对象声明比较常用的地方就是在这里,对象声明用Objcet关键字表示。

1
2
3
4
5
6
7
8
object Constant {
/**
* baseUrl
*/
val REQUEST_BASE_URL = "http://apicloud.mob.com/user/"

val KEY = "1be865c0e67e3"
}

使用的时候直接类名加.加变量名,如Constant.REQUEST_BASE_URL

使用数据类

前面说过,Kotlin的惯用语法是有写POJO类,一般写那种类都是用data修饰的类,也就是数据类表示,只保存数据的类(JavaBean)。

1
data class LoginResponse(val msg: String, val result: LoginResultResponse, val retCode: String)

使用扩展函数

1
2
3
4

fun loge(tag: String, content: String?) {
Log.e(tag, content ?: tag)
}

调用的时候直接使用loge(TAG, "content")

后话

Kotlin写起来非常方便,里面的非空(non-null)可以避免空指针异常等等的好处,本demo的代码放到github,欢迎starsissues