DataBinding 大坑总结(网上我暂时搜不到解决方法)

描述优缺点和简单使用
http://www.jianshu.com/p/d4e384c98987

用户指南
http://www.jianshu.com/p/b1df61a4df77

在使用多Module中使用DataBinding会引发一些奇怪的问题,最近好好的腾出时间来折腾这些奇怪的问题:

1:如果当Module启动DataBinding重启AS启动报错的话,就启用允许多行代码
android { 
  defaultConfig {
     multiDexEnabled true
  }
}
dependencies {
  //解决超过65546代码的问题
  compile 'com.android.support:multidex:1.0.2'
}
2:为什么include的Toolbar(或者别的控件)在代码里面显示是View?因为这个Toolbar的布局代码文件在Module,合并在app的时候,编译所看到的是view,这个只能由Google后面优化了,但是目前可以用这种方式来缓冲
public abstract class BaseFragmentListConditionDataBind extends BaseFragmentListCondition {

    public B mViewBinding;
    public ToolbarCommonBinding mToolbarCommonBinding;

    @Override
    public void initDataBind(View view) {
        mViewBinding = DataBindingUtil.bind(view);
        mToolbarCommonBinding = DataBindingUtil.bind(view.findViewById(R.id.toolbarCommon));
    }
}
3.因为module使用DataBinding这系列奇怪问题
Error:Execution failed for task ':library:test:transformClassesAndResourcesWithPrepareIntermediateJarsForDebug'.
> failure, see logs for details.
  Error reading contents of H:\mobile\code\trunk\as\library\test\build\intermediates\data-binding-compiler\debug\dependent-lib-artifacts directory java.nio.file.NoSuchFileException: H:\mobile\code\trunk\as\library\test\build\intermediates\data-binding-compiler\debug\dependent-lib-artifacts
    at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:79)
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)
    at sun.nio.fs.WindowsDirectoryStream.(WindowsDirectoryStream.java:86)
    at sun.nio.fs.WindowsFileSystemProvider.newDirectoryStream(WindowsFileSystemProvider.java:518)
    at java.nio.file.Files.newDirectoryStream(Files.java:457)
    at android.databinding.tool.DataBindingBuilder.getBRFilePackages(DataBindingBuilder.java:145)
    at android.databinding.tool.DataBindingBuilder.getJarExcludeList(DataBindingBuilder.java:128)
    at com.android.build.gradle.internal.LibraryTaskManager.lambda$excludeDataBindingClassesIfNecessary$19(LibraryTaskManager.java:688)

关于这个坑爹的问题我一直不敢确认我这个是否正确,也折腾了我好几天,我处理方式是把主项目的Module都引用到新项目的Module使用,然后获取到具体的错误问题,我这边获取到问题是把com.github.chrisbanes:PhotoView:1.0.0升级成com.github.chrisbanes:PhotoView:2.1.3。然后再运行主项目,这个问题又没了,真的是超级超级蛋疼。

4.多个module之间,他们生成的layout。名称绝对不能一样。

不然会出现上面的一系列问题。

5.如果以上问题都解决不了,删除app和module的所有build和.gradle文件夹,就可以解决了,关于第三个问题也是能用这个方法解决的
6.还是关于module之间的生成dataBinding的问题。关于这个问题我折腾了2,3天了,最后特意搞了一个小项目,这个问题目前google搜索不到,可能这种形式做法的相当相当少,但总算找到一个折腾的方式解决

假设我们有一个这样的需求,module项目使用抽象基类,并且抽象基类已经确定了生成好的databinding


2个抽象基类

DataBinding 大坑总结(网上我暂时搜不到解决方法)_第1张图片
最底层基类

DataBinding 大坑总结(网上我暂时搜不到解决方法)_第2张图片
第二个基类

至于基类的逻辑我们暂且不管,这不是重点,重点是我们看这个app的实现类


DataBinding 大坑总结(网上我暂时搜不到解决方法)_第3张图片
实现类,大家可以看到,说找不到databinding,最开始我也以为是缓存原因,按照上面的方式全部解决,都不行,实在焦急啊!!最后……

两种方式解决:


DataBinding 大坑总结(网上我暂时搜不到解决方法)_第4张图片
看到这种奇怪的方式解决了吗?!标记FragmentOrderBinding是哪个类的就可以解决这个问题了……
DataBinding 大坑总结(网上我暂时搜不到解决方法)_第5张图片
如果怕灰色不小心删掉的话,可以使用这种泛型方式

反正最终就是在app的类里面,明确该DataBinding是属于某个lib即可!

7.关于在module使用泛型DataBinding类时

会提示找不到所有生成的DataBinding。目前解决方式只能是module不用泛型DataBinding,只在app使用泛型DataBinding

8.databinding不存在

当编译错误的时候,会发现很多提示databinding不存在,如下图


DataBinding 大坑总结(网上我暂时搜不到解决方法)_第6张图片
image.png

如果你拖到最下面,会看到真正导致错误的问题,如下图


DataBinding 大坑总结(网上我暂时搜不到解决方法)_第7张图片
image.png

databinding有个问题,就是当你本来正常的项目,一顿猛如虎的代码操作后,运行编译出错,会出现一种情况,全是提示databinding不存在,并没有显示真正导致错误的问题,如下图
DataBinding 大坑总结(网上我暂时搜不到解决方法)_第8张图片
image.png

那么解决方式:
可能目前还未比较完善,我是用排除方式一个一个模块进行删除,运行,找到真正的错误,最后在这里发现:


DataBinding 大坑总结(网上我暂时搜不到解决方法)_第9张图片
image.png

你们可以看到,错误提示里面,并没有提示如图中的代码错误。这种问题是非常纠结非常纠结的!
如果有更好的解决方式,求指导!

8. gradle升级到4.6后,DataBinding编译时报告参数过多

2019-9-27更新
这是最近碰到的一个问题,gradle4.1是没有这个问题的,而4.6就报这个参数过多问题了,原因是每个DataBinding编译生成的时候会在自动生成的类里面有个构造函数,而4.6的构造函数不知道为什么会报参数过多。至于解决方法,我目前是又退回4.1了,google暂时搜不到什么解决方法

你可能感兴趣的:(DataBinding 大坑总结(网上我暂时搜不到解决方法))