TOP

Kotlin从入门到掉坑里
2017-10-13 10:30:47 】 浏览:11062
Tags:Kotlin 入门

为什么要用Kotlin,和Java完全兼容,相互之间引用完全不是问题,所有没有什么负担。
使用Kotlin已经近一个月,基本上看完了语法就上正式项目了,期间几次准备放弃,最终坚持下来了。关于Kotlin的优点,不必多说了,基于这一个月的经验,来说说Kotlin的入门和坑。

配置工程

添加依赖

作为一个Android码农,使用Kotlin很简单,首先在Android Studio中安装Kotlin插件,在Browse repositories中搜索Kotlin,安装人数最多的那个就是。
安装完成之后,连续按4下shift键,输入config kotlin 进行搜索,选择Config Kotlin in Project,选择Android Gradle,选择app module,工程就配置完成。

转换Java到Kotlin

连续按4下shift键,输入Convert Java Files 进行搜索,选择Convert Java Files to Kotlin Files,可以自动将Java转换为Kotlin

入门

变量声明

  • var 可变变量
  • val 不可变变量

声明变量的格式

var str: String

Kotlin不允许声明变量但不初始化,以String为例,以下三种初始化方式

赋非空值

var str: String = ""

设为null

var str: String? = null

强制设为null

var str: String = null!!

Kotlin是空安全的,但是第三种是例外情况,如果给一个变量赋值为null!!,那么就等于声明这个变量不是空安全的,就算这样使用

var str:String = null!!
str.length

编译器也不会报错

第一种方式,赋值之后不能将str设为null或其他String?的值,否则编译器会报错,第二种方式,每次使用时必须要进行检查,直接使用的话编译器会报错,这样就保证了空安全。举个例子:

var str: String = ""
// str 不是空的,可以直接使用不必检查是否为空
// 可以随意给str赋非空值
str = "hello kotlin"

// 这样编译器是会报错的
str = null

// 如果强制设为null,str就不再是空安全的,编译也就不会检查str了
str = null!!

// 声明str2为可空的变量,str2也是空安全的
var str2: String? = null

// 直接使用str2编译器会报错
str2.length
// 可以这样用
str2?.let {
    log(str2)
}

// str2赋值给str也会报错

最后达到的目的就是,使用一个空变量会报错,使用一个可能为空的变量不检查也会报错,如果觉的检查是否为空太麻烦了,Kotlin支持

if (result?.data?.item?.name != null) {
    log(result?.data?.item?.name)
}

lamda

神奇的it

Kotlin的lamda表达式很简洁,设置OnClickListener

textView.setOnClickListener {
    view -> openActivity(view.context)
}

只有一个参数的时候,是可以隐藏的,用it

textView.setOnClickListener {
    openActivity(it.context)
}

多个参数的时候

checkbox.setOnCheckedChangeListener { compoundButton, b ->
}

Kotlin的函数可以作为参数,写callback的时候,可以不用interface了

// 声明一个callback
var callback: (()->Unit)? = null
// 判断并使用
callback?.invoke()

// 想带参数
var callback: ((str: String)->Unit)? = null
// 判断并使用
callback?.invoke(str)

// set callback
item.callback = {
    // do something
}
// 带参数的callback
item.callback = {
    doSomething(it)
}

遇到的坑

Databinding

需要在app moudle的build.gradle里面添加

kapt {
    generateStubs = true
}
dependencies {
    kapt 'com.android.databinding:compiler:2.2.0-rc2'
}

2.2.0-rc2 这个版本号必须要和根目录下的build.gradle文件内的com.android.tools.build:gradle:2.2.0-rc2 版本号一致

Dagger2

官方博客说是支持Dagger2的,但实际遇到的情况是和Databinding结合使用有问题

奇怪的报错

使用Databinding,设置ViewModel时

cannot access class '...'. check your module classpath for missing or conflicting dependencies

应该是Kotlin的bug,只是报错,不影响编译,如果不希望提示错误,可以添加
@Suppress("MISSING_DEPENDENCY_CLASS")

编译的时候报找不到class的问题,clean一下就好,不知道什么原因

不知道代码怎么写

Java的代码提示很方便,setListener,基本只用输入new,按代码提示回车就自动完成了,匿名函数应该怎么写呢

 textView.setOnClickListener(object: View.OnClickListener {
            override fun onClick(v: View?) {
            }
})

静态变量应该怎么写呢

class A {
    companion object {
        val TAG = "classA"
    }
}

// 在Java代码中使用
A.Companion.getTAG()

怎么从Kotlin转为Java

两种方法

  • 打包,输出apk,使用dex2jar将apk代码文件提取成jar,使用jd-jui查看,将对应的代码拷贝出来,修改,使用
  • 把Kotlin文件删掉,用Java重写一遍

Kotlin从入门到掉坑里 https://www.cppentry.com/bencandy.php?fid=98&id=162107

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Android之动态申请权限(API23以.. 下一篇Android ExpandableListView的技..