Kotlin组件化项目gradle3.0踩坑记录


组件化之compile

每个module的联合编译以及依赖库的使用,由以前的compile变成了implementation,但是好像并不是这样啊。
这篇文章:Android 彻底组件化番外篇-gradle3.0.0 有很详细的说明,取核心:

“  首先 compile 被废弃了,而是分成了两个:implementation 和 api,其中 api 与之前的 compile 功能基本一致,不再赘述;implementation 就比较高级了,其作用就是,使用 implementation 添加的依赖不会再编译期间被其他组件引用到,但在运行期间是完全可见的。这也是一种代码隔离。举个例子,

组件A依赖lib1,既A implementation lib1
组件B依赖组件A,既B api A  ”

简单描述写我的问题,插件级别的比如

apply plugin: 'kotlin-android-extensions'

需要每个有使用该插件的module配置,代码层面的比如:

api 'com.android.support:appcompat-v7:26.1.0'

只需要配置在BaseLib中,但是需要将implementation换成api,这样其他module才可共用。

java.lang.NoSuchMethodError: No static method getFont

解决方案就是把你的编译sdk升下,26变27,资源库什么的也换成27,莫名其妙的明明前一秒都可以用,后来发现真不是就我才这样

比如:https://blog.csdn.net/haha223545/article/details/78728980

kotlin findviewbyid报错: type inference failed: Not enough information to infer parameter T in...

代码里我是这样写的:

val height = mRootView.findViewById(R.id.mPopView).top

后来查阅了一些资料,改了下,成了这样:

val relativeLayout: RelativeLayout = mRootView.findViewById(R.id.mPopView)
val height = relativeLayout.top

实在话,这不是多此一举?然后再仔细看了看,这样就行了

val height = mRootView.findViewById<RelativeLayout>(R.id.mPopView).top

原因可想而知了,View的具体实现类太多,无法确定实例化对象,给传入类型就好了

编译时错误:找不到javax.annotation.Nullable的问题

这个问题出现在我对旧项目的组件化改造中,应该是存在某个自定义控件之中,当然我也不是第一个遇到的,网上很容易就找到了解决办法,加入一个具有该注解类的依赖即可

api "com.google.code.findbugs:jsr305:3.0.2"

同步一下就ok

Style.xml异常 cannot resolve symbol “Theme”

这个是AS3.1的bug,在file选项中close project,然后在主界面 用open existing project选择项目路径后打开即可

Can not perform this action after onSaveInstanceState with xxxxFragment

ft.commit()替换为ft.commitAllowingStateLoss()

参见:https://blog.csdn.net/chenshufei2/article/details/48747149

ARouter There is no route match the path [/xxx/xxx], in group [xxx][ ]

其实一般都是配置问题,基本使用仔细查阅官方文档,

一般情况取前面两组即可,以kotlin开发为例

每个需要使用得对应模块下得build.gradle文件都需要添加以下内容,

//必须添加
apply plugin: 'kotlin-kapt'

//必须添加
kapt {
    arguments {
        arg("moduleName", project.getName())
    }
}

android {
    //忽略
}

dependencies {
   //...
   //必须添加
    kapt "com.alibaba:arouter-compiler:${arouter_version}"
}

上面是每个模块都需要的,但是arouter-api只需要配置在BaseLib模块中即可

api "com.alibaba:arouter-api:1.3.1"

基本使用,需要跳转的activity上加上注解

@Route(path = RouterPath.UserCenter.PATH_LOGIN)//这里实际上是:"/userCenter/login"
class LoginActivity : BaseActivity<LoginPresenter>(),LoginContract.LoginView {}

需要跳转的地方:

ARouter.getInstance().build(RouterPath.UserCenter.PATH_LOGIN).navigation()

以上,简单使用完毕。

待续。。。

声明:TIL|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA[ZH]协议进行授权

转载:转载请注明原文链接 - Kotlin组件化项目gradle3.0踩坑记录


Life is very interesting. In the end, some of your greatest pains become your greatest strengths.