項(xiàng)目引用Kotlin與databinding,ARouter差购,Architecture Components沖突解決辦法

個(gè)人項(xiàng)目的整體結(jié)構(gòu)

project.png
推薦依賴(lài)API的做法
  • 我私人創(chuàng)建多模塊開(kāi)發(fā)四瘫,所以模塊之前添加依賴(lài)會(huì)導(dǎo)致version五花八門(mén),這個(gè)建議在根目錄下創(chuàng)建dependencies.gradle,用于對(duì)依賴(lài)統(tǒng)一進(jìn)行管理欲逃,代碼如下(new file時(shí)候把后綴名輸入就可以粗暴創(chuàng)建gradle文件了)

ext {

    //true 每個(gè)業(yè)務(wù)Module可以單獨(dú)開(kāi)發(fā)
    //false 每個(gè)業(yè)務(wù)Module以lib的方式運(yùn)行
    //修改之后需要Sync方可生效
    isModule = false

    compileSdkVersion = 26
    minSdkVersion = 15
    targetSdkVersion = 26
    androidSupportLibraryVersion = '26.1.0'

    butterknifeVersion = '8.1.0'

    versions = [
            arouterApiVersion       : "1.4.1",
            arouterCompilerVersion  : "1.2.2",
            arouterannotationVersion: "1.0.4",
            arouterRegisterVersion  : "1.0.2",
            archLifecycleVersion    : "1.0.0",
            archRoomVersion         : "1.0.0",
    ]

    support = [
            'v4' : "com.android.support:support-v4:$androidSupportLibraryVersion",
            'annotations'           : "com.android.support:support-annotations:$androidSupportLibraryVersion",
            'compat'                : "com.android.support:support-compat:$androidSupportLibraryVersion",
            'appcompat'             : "com.android.support:appcompat-v7:$androidSupportLibraryVersion",
            'gridlayout'            : "com.android.support:gridlayout-v7:$androidSupportLibraryVersion",
            'recyclerview'          : "com.android.support:recyclerview-v7:$androidSupportLibraryVersion",
            'design'                : "com.android.support:design:$androidSupportLibraryVersion",
            'cardview'              : "com.android.support:cardview-v7:$androidSupportLibraryVersion",
            'preference'            : "com.android.support:preference-v7:$androidSupportLibraryVersion",
            'multidex'              : 'com.android.support:multidex:1.0.3',
            'constraintlayout'      : 'com.android.support.constraint:constraint-layout:1.0.2',
            'exifinterface'         : "com.android.support:exifinterface:$androidSupportLibraryVersion",
            'testrunner'            : 'com.android.support.test:runner:1.0.2',
            'room'                  : "android.arch.persistence.room:runtime:1.0.0",
            'core'                  : "com.android.support:support-core-utils:$androidSupportLibraryVersion",
            'lifecycle'             : "android.arch.lifecycle:extensions:${versions["archLifecycleVersion"]}",
            'lifecycle_compile'     : "android.arch.lifecycle:compiler:${versions["archLifecycleVersion"]}",
            'room'                  : "android.arch.persistence.room:runtime:${versions["archRoomVersion"]}",
            'room_compile'          : "android.arch.persistence.room:compiler:${versions["archRoomVersion"]}"

    ]

    third = [
            'arouter_api'           : "com.alibaba:arouter-api:${versions["arouterApiVersion"]}",
            'arouter_compiler'      : "com.alibaba:arouter-compiler:${versions["arouterCompilerVersion"]}",
            'arouter_annotation'    : "com.alibaba:arouter-annotation:${versions["arouterannotationVersion"]}",
            'arouter-register'      : "com.alibaba:arouter-register:${versions["arouterRegisterVersion"]}",
            'butterknife'           : "com.jakewharton:butterknife:$butterknifeVersion",
            'butterknife_compiler'  : "com.jakewharton:butterknife-compiler:$butterknifeVersion",

    ]
}

  • 新建完gradle文件后找蜜,必須要與項(xiàng)目root 關(guān)聯(lián)起來(lái),要不引用時(shí)候會(huì)報(bào)錯(cuò)的稳析。引用方法:找到project下的gradle锹杈,用apply from加入對(duì)dependencies.gradle的依賴(lài)。
apply from:"dependencies.gradle"
buildscript {
    ext.kotlin_version = '1.2.71'

    repositories {
        maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/' }
        maven{ url 'https://maven.aliyun.com/repository/google' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}

allprojects {
    repositories {
        maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/' }
        maven{ url 'https://maven.aliyun.com/repository/google' }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

問(wèn)題場(chǎng)景

原本java的項(xiàng)目引入Kotlin作為開(kāi)發(fā)語(yǔ)言迈着,在模塊還沒(méi)引用kotlin之前是采用databinding和ARouter進(jìn)行ui綁定和模塊界面跳轉(zhuǎn)的竭望,但是引入Kotlin后出現(xiàn)問(wèn)題1:databinding沖突;問(wèn)題2:ARouter提示跳轉(zhuǎn)路徑找不到裕菠;問(wèn)題3:Android Architecture Components提示找不到ViewModelProviders

解決辦法

問(wèn)題一咬清,與databinding沖突解決方法

在自己的模塊的gradle文件進(jìn)行配置,我是在module_main模塊中引入Kotlin進(jìn)行開(kāi)發(fā)的奴潘,所以我需要在app(module_main)build.gradle文件中添加一下配置信息有

  • apply plugin: 'kotlin-kapt'
  • kapt "com.android.databinding:compiler:3.1.0" (3.1.0 is your gradle version)
  • kapt {generateStubs = true}
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
android {
      ………………………………
    }

    buildTypes {
        ………………………………
    }

    dataBinding {
        enabled true
    }

}

dependencies {
   ………………………………
    kapt "com.android.databinding:compiler:3.1.0"
}

kapt {
    generateStubs = true
}

repositories {
    mavenCentral()
}
問(wèn)題二旧烧,ARouter提示找不到跳轉(zhuǎn)路徑的解決辦法

這個(gè)僅使用與你項(xiàng)目本來(lái)是可以用ARouter來(lái)進(jìn)行跳轉(zhuǎn)的,在跳轉(zhuǎn)到Kotlin的Activity時(shí)候提示找不到路徑的場(chǎng)景画髓。

  1. 原本模塊在純java模塊下的ARouter的gradle配置信息如下
  • javaCompileOptions {
    annotationProcessorOptions {
    arguments = [ moduleName : project.getName() ]
    }
    annotationProcessorOptions {
    arguments = [AROUTER_MODULE_NAME: project.getName()]
    }
    }
  • implementation rootProject.ext.third["arouter_api"]
  • annotationProcessor rootProject.ext.third["arouter_compiler"]
android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    defaultConfig {
        //rootProject.ext是依賴(lài)與dependencies.gradle定義的屬性
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        //Arouter路由配置(每個(gè)Module都需要添加掘剪,要不然無(wú)法跳轉(zhuǎn))
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [ moduleName : project.getName() ]
            }
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }
    }

    buildTypes {
        release {
            ………………
        }
        debug {
           ………………
        }
    }
}
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
     …………………………
    //Arouter路由,因?yàn)閏ommon模塊(通用模塊)引用了arouter_api奈虾,所以該模塊不需要再引用夺谁,這里要自己區(qū)分api與implementation
//    implementation rootProject.ext.third["arouter_api"]
    implementation project(':common')
    annotationProcessor rootProject.ext.third["arouter_compiler"]
}
  1. 模塊添加Kotlin代碼后,在沒(méi)有修改gradle配置信息情況下肉微,導(dǎo)致ARouter提示找不到相關(guān)的UI的路徑匾鸥。原因是因?yàn)镵otlin的插件與Java不同,Java不支持Kotlin的代碼碉纳,但是Kotlin的插件卻完美支持Kotlin與Java代碼勿负。下面我們需要修改gradle信息如下
  • kapt {
    arguments {
    arg("moduleName", project.getName())
    arg("AROUTER_MODULE_NAME",project.getName())
    }
    generateStubs = true
    }
  • kapt rootProject.ext.third["arouter_compiler"]
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    defaultConfig {
        ……………………
        //Arouter路由配置(每個(gè)Module都需要添加,要不然無(wú)法跳轉(zhuǎn))
//        javaCompileOptions {
//            annotationProcessorOptions {
//                arguments = [ moduleName : project.getName() ]
//            }
//            annotationProcessorOptions {
//                arguments = [AROUTER_MODULE_NAME: project.getName()]
//            }
//        }
        //如果存在kotlin和java代碼必須配置下面的代碼
        kapt {
            arguments {
                arg("moduleName", project.getName())
                arg("AROUTER_MODULE_NAME",project.getName())
            }
            generateStubs = true
        }
    }

    buildTypes {
       …………
    }

    dataBinding {
        enabled true
    }

}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
   …………………………
    //Arouter路由劳曹,因?yàn)閏ommon模塊引用了arouter_api奴愉,所以該模塊不需要再引用
//    implementation rootProject.ext.third["arouter_api"]
    implementation project(':common')
//    annotationProcessor rootProject.ext.third["arouter_compiler"]
    kapt rootProject.ext.third["arouter_compiler"]
   ……………………
    kapt "com.android.databinding:compiler:3.1.0"
}

kapt {
    generateStubs = true
}

repositories {
    mavenCentral()
}

這里需要弄清楚kapt與annotationProcessor區(qū)別可以查看KAPT(Annotation Processing for Kotlin)是什么

問(wèn)題三琅摩,ViewModelProviders提示找不到

google新推出MVVM+Android Architecture Components,優(yōu)勢(shì)在于不用管理Activity與Fragment的生命周期锭硼,當(dāng)數(shù)據(jù)更新時(shí)候會(huì)自動(dòng)通知到ui上房资,當(dāng)然它這個(gè)實(shí)現(xiàn)還是基于觀(guān)察者模式的,訂閱-發(fā)布過(guò)程账忘。作為一名優(yōu)(懶)秀(惰)程序員當(dāng)然要引入自己項(xiàng)目中啦志膀。

  1. gradle的配置信息
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
android {
    …………………………
    }
    buildTypes {
       ………………
    }
    dataBinding {
        enabled true
    }
}

dependencies {
    ……………………
    //liveData 如果有kotlin代碼熙宇,annotationProcessor必須用kapt代替鳖擒,要不功能無(wú)法正常使用m
    implementation rootProject.ext.support["lifecycle"]
    annotationProcessor rootProject.ext.support["lifecycle_compile"]
    implementation rootProject.ext.support["room"]
    annotationProcessor rootProject.ext.support["room_compile"]
    ……………………
}
kapt {
    generateStubs = true
}
repositories {
    mavenCentral()
}

問(wèn)題來(lái)了,javaUI跳轉(zhuǎn)到Kotlin寫(xiě)的UI上App閃退烫止,項(xiàng)目報(bào)錯(cuò)信息:Failed resolution of: Landroid/arch/lifecycle/ViewModelProviders蒋荚,google了很多方法之后都沒(méi)用,突然想到ARouter的解決方法馆蠕,有點(diǎn)共同性期升,靈機(jī)一動(dòng),我就把上面的annotationProcessor替換成了kapt互躬,然后項(xiàng)目就成功運(yùn)行了播赁。真是機(jī)(傻)智(逼)如(shi)我(wo)。其實(shí)核心問(wèn)題就是沒(méi)弄懂a(chǎn)nnotationProcessor的作用吼渡。想學(xué)習(xí)如何使用Android Architecture Components的童鞋可以去github的官方demo學(xué)習(xí)容为,鏈接如下android-lifecycles

希望能幫到大家增加對(duì)android的熱愛(ài),fighting……

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末寺酪,一起剝皮案震驚了整個(gè)濱河市坎背,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寄雀,老刑警劉巖得滤,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異盒犹,居然都是意外死亡懂更,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)急膀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)膜蛔,“玉大人,你說(shuō)我怎么就攤上這事脖阵≡砉桑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵命黔,是天一觀(guān)的道長(zhǎng)呜呐。 經(jīng)常有香客問(wèn)我就斤,道長(zhǎng),這世上最難降的妖魔是什么蘑辑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任洋机,我火速辦了婚禮,結(jié)果婚禮上洋魂,老公的妹妹穿的比我還像新娘绷旗。我一直安慰自己,他們只是感情好副砍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布衔肢。 她就那樣靜靜地躺著,像睡著了一般豁翎。 火紅的嫁衣襯著肌膚如雪角骤。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天心剥,我揣著相機(jī)與錄音邦尊,去河邊找鬼。 笑死优烧,一個(gè)胖子當(dāng)著我的面吹牛蝉揍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播畦娄,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼又沾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了纷责?” 一聲冷哼從身側(cè)響起捍掺,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎再膳,沒(méi)想到半個(gè)月后挺勿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喂柒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年不瓶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灾杰。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蚊丐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出艳吠,到底是詐尸還是另有隱情麦备,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站凛篙,受9級(jí)特大地震影響黍匾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜呛梆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一锐涯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧填物,春花似錦纹腌、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至雁刷,卻和暖如春覆劈,著一層夾襖步出監(jiān)牢的瞬間保礼,已是汗流浹背沛励。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炮障,地道東北人目派。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像胁赢,于是被迫代替她去往敵國(guó)和親企蹭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354