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并没有错误。以下简述问题排查过程,及解决方案

  1. 分析排查问题,与AndroidStudio以及gradle版本升级无关。
  2. DataBinding的注册,使用也是正常
  3. 问题点,在于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 …

你可能感兴趣的:(Android笔记)