当前位置: 首页 > >

Duplicate class found in the file ActivityLoginBinding && 找不到符号 DataBindingComponents

Duplicate class found in the file ActivityLoginBinding && 找不到符号 DataBindingComponents



文章目录
Duplicate class found in the file ActivityLoginBinding && 找不到符号 DataBindingComponents一、问题描述二、问题排查







一、问题描述

最*在项目开发中,使用kotlin开发,同时使用模块化、组件化的架构设计,采用ARouter作为路由框架,MVVM的软件分层结构,其中就用到DataBinding。然而,问题也就从这里开始……



起初,并不怎么会写kotlin代码,先简单的写出java文件,然后使用AndroidStudio的转换工具,生成kotin,由于同时引入了较多的新技术,如Jetpack等。所以好多代码还是java实现的。项目中就出现了java与kotin共存的代码。然后随着kotlin的熟悉,开始全面使用kotlin实现业务,同时也将原有的java代码进行重构。坑就是这么来的。


Duplicate class found in the file&&找不到符号 DataBindingComponents

由于项目已经解决问题,忘记了截图,所以此处就不配图了。也因为是在升级AndroidStudio为最新的3.3版本才引发这个问题,所以最初的思路都是围绕AS版本,以及gradle版本的问题来排查。


而报错DataBinding,同时也有ARouter的错误提示can not be private !!!之类的,当时忽略,主要精力去看了DataBinding的处理。


二、问题排查

可以确定的是layout并没有错误。以下简述问题排查过程,及解决方案


    分析排查问题,与AndroidStudio以及gradle版本升级无关。DataBinding的注册,使用也是正常问题点,在于AndroidStudio转换javakotlin生成的kotlin文件,并不是最佳的,甚至可能已经不符合kotlin的标准规范写法。
    比如,lateinit的使用是否恰当合理,有些字段声明,需要显式的初始化getter()setter()kotlin中的重写,是否与已有的字段声明产生了冲突
    关键点,注解,@BindingAdapter@AutowiredDataBinding以及ARouter框架中的注解标注,在java代码中可以无误生效,但是在kotlin中,可能就有问题。
    比如ARouter注解@Autowiredkotlin中就需要额外添加@JvmField来标注字段,才能对应与在java中的效果。
    @BindingAdaperDataBinding中用于转换的自定义属性的函数注解。在java中,需要将注写在一个static的函数上:

    public class OtherTool {

    //这里使用databinding的转换功能,将对象转化为string,这个在xml的text属性中,就能使用对象来自动转换为string,主要是不需要显示的导入和引用此函数
    @BindingConversion
    public static String converStr(CommonUser user) {
    return user.getAge() + user.getName() + user.isSingle();
    }

    //同上,不需要显示因如何调用,在xml中即可使得textview有一个 bg 的属性,app命名空间的,
    @BindingAdapter({"bg"})
    public static void randomName(TextView tv, String color) {
    tv.setTextColor(Color.parseColor(color));
    }
    }
    但是在kotlin中,没有static字段,就需要

    object OtherTool{
    @JvmStatic
    @BindingAdapter({"bg"})
    fun randomName(tv:TextView,color:String){
    tv.setTextColor(Color.parseColor(color))
    }
    }
    或者,注意下面的就是直接在写某个kt文件内,而不是属于某个class

    @BindingAdapter({"bg"})
    fun randomName(tv:TextView,color:String){
    tv.setTextColor(Color.parseColor(color))
    }


综上所述,一个折腾了我一天的问题,其实就是ARouter的某些注解,在kotlin中还需要额外的@Jvm之类的注解,才有效。这是ARouterkotlin支持不够的原因。同时还有使用AndroidStuido转换的kotlin文件,是不一定正确符合规范的,最好还是自己写。


:在StackOverflow上有人提问了类似问题。Duplicate class found …



友情链接: year2525网 工作范文网 QS-ISP 138资料网 528200 工作范文网 baothai 表格模版