kotlin使用过程中的踩坑记录

  1. app的build.gradle中也需要加上implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version",否则可能会出现Unresolved reference: JvmName类似的错误

  2. Arouter中使用kotlin编写的Interceptor不生效的问题:

    问题原因在于kotlin文件中的@Interceptor注解没有被正确处理,因此没有将自定义的Interceptor加入到Interceptor集合中,解决方法为在module的build.gradle文件中:

    a. 加入

    apply plugin: 'kotlin-kapt'

    b. 使用

    kapt {
        arguments {
            arg("moduleName", project.getName())
        }
    }

     代替

    javaCompileOptions {
        annotationProcessorOptions {
            arguments = [moduleName: project.getName()]
        }
    }

    c. 使用

    kapt 'com.alibaba:arouter-compiler:1.0.4'

    代替

    annotationProcessor 'com.alibaba:arouter-compiler:1.0.4'

    ps:kapt 可以替代annotationProcessor 注释java类

  3. 在java代码中调用kotlin编写的object类中的方法时,需要先获取该object类的INSTANCE实例,然后再调用对应方法。

  4. kotlin中集合有严格的只读和可写的区分,使用List类型是不能调用诸如clear,remove等方法的,要使用MutableList

  5. kotlin中的类的构造方法用constructor表示,与java不同的是,java中用与类名相同且没有返回值的方法表示构造方法,这个区别也导致kotlin类中可以存在名字和类名相同的非构造方法

  6. 当在匿名内部类中(如各种监听)想要调用一个跟回调方法同名的外部类的方法怎么办?用this@外部类类名.方法名

  7. 声明为var的nullable变量在使用时出现Smart cast to 'String' is impossible, because 'a.name' is a mutable property that could have been changed by this time的报错,解决方法为:

    • 使用val声明nullable值,这样nullable值就不可能被修改

    class A {
      val name: String? = null
    }
    • 把nullable值赋给一个新的变量,再做其他操作

     val name = a.name
      if(name != null) {
         names.add(name);
      }
    
    • 使用?.let

    a.name?.let { name -> names.add(name) }
    a.name?.let { names.add(it) }
    a.name?.let(names::add)

     

  8. 使用Gson解析json时,如果bean类继承了父类并在主构造函数中覆盖了父类的属性,那么会报错:declares multiple JSON fields named name 比如:

    open class Person: Serializable{
        open var name: String? = null
    }
    class SpecialPerson(override var name: String?) : Person() {
        override fun toString(): String {
            return name?: ""
        }
    }

    解决方法是,在子类中用init初始化块将构造函数中获取到的属性值赋给继承的属性,即:

    class SpecialPerson(var specialName: String?) : Person() {
        init {
            name = specialName
        }
        override fun toString(): String {
            return name?: ""
        }
    }

    未完待续。。。

没有更多推荐了,返回首页