介绍
这篇文章将为大家详细讲解有关怎么在Android中库模块生成类,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
<强>库模块生成类强>
在库模块下启用数据绑定很简单,跟应用程序模块一样,加上:
android {, ,dataBinding { enabled 才能=,真的 ,} }
对应生成的绑定类会在清单里面指定的包名称下的数据绑定包下。
<强>坑强>
于是坑的地方就在这里了,编译不过了…
为啥呢?报错说象征找不到…于是在模块的构建下查看生成的绑定类…卧槽? !怎么是抽象的?怎么都找不到那些得到方法了?虽然我也不知道为什么我们会从绑定类里面去拿之前设置进去的ViewModel。
WTF ? !
<>强发生强>
去他妈的归,究竟怎么回事还是要研究一下的。
是我们姿势错了? Dagger2生成哪里出问题了吗?还是数据绑定的bug呢?
因为之前也研究生过数据绑定成部分的代码,所以找到问题所在没有花太多时间,这里不多啰嗦,直接看对应位置。
在CompilerChief的writeViewBinderInterfaces中:
public void writeViewBinderInterfaces (boolean isLibrary), { ,ensureDataBinder (); ,mDataBinder.writerBaseClasses (isLibrary); }
对应DataBinder:
public void writerBaseClasses (boolean isLibrary), { ,for (LayoutBinder LayoutBinder : mLayoutBinders), { try {才能 ,,Scope.enter (layoutBinder); ,,if (isLibrary | |, layoutBinder.hasVariations ()), { ,,,String className =, layoutBinder.getClassName (); ,,,String canonicalName =, layoutBinder.getPackage(), +,“干净,+,名称; ,,,if (mWrittenClasses.contains (canonicalName)), { ,,,,继续; ,,,} ,,,清醒的(“writing  data binder base % s",, canonicalName); ,,,mFileWriter.writeToFile (canonicalName, ,,,,,layoutBinder.writeViewBinderBaseClass (isLibrary)); ,,,mWrittenClasses.add (canonicalName); ,,} ,,},catch (ScopedException 交货){ ,,Scope.defer (ex); ,,},{finally ,,Scope.exit (); ,,} ,} }
这里调用了LayoutBinder(真正的实现类会调用writeViewBinder):
public String writeViewBinderBaseClass (boolean forLibrary), { ,ensureWriter (); ,return mWriter.writeBaseClass (forLibrary); }
可以看到如果是库模块,我们会做特殊的编译,而不会生成真正的实现:
public fun writeBaseClass (forLibrary :布尔),:String =,kcode (“package $ {layoutBinder. '包'};“),{ Scope.reset才能() 问才能(“import android.databinding.Bindable;“) 问才能(“import android.databinding.DataBindingUtil;“) 问才能(“import android.databinding.ViewDataBinding;“) 问(才能“public  abstract class baseClassName 美元;extends ViewDataBinding {“) layoutBinder.sortedTargets.filter才能{零}it.id !=, .forEach { ,,选项卡(“public  final $ {it.interfaceClass}, {it.fieldName}美元;“) ,,} 问才能(“”) 选项卡(才能“protected  baseClassName美元(android.databinding.DataBindingComponent bindingComponent, android.view.View root_,, int localFieldCount"), { ,,layoutBinder.sortedTargets.filter{零}it.id !=, .forEach { ,,,选项卡(“,,$ {it.interfaceClass}, {it.constructorParamName}“美元) ,,} ,,} ,,选项卡(“),{“),{ ,,选项卡(“超级(bindingComponent, root_,, localFieldCount);“) ,,layoutBinder.sortedTargets.filter{零}it.id !=, .forEach { ,,,选项卡(“。$ {it.fieldName},=, $ {it.constructorParamName};“) ,,} ,,} 选项卡才能(“}”) 问才能(“”) variables.forEach {才能 ,,if (it.userDefinedType !=, null), { ,,,val type =, ModelAnalyzer.getInstance () .applyImports (it.userDefinedType, model.imports) ,,,选项卡(“public  abstract void $ {it.setterName} ($ type $ {it.readableName});“) ,,} ,,} 选项卡(才能“public  static baseClassName 美元;膨胀(android.view.LayoutInflater 增压泵,android.view.ViewGroup 根,,boolean attachToRoot), {“), { ,,选项卡(“return 膨胀(根,增压泵,还以为,attachToRoot, android.databinding.DataBindingUtil.getDefaultComponent ());“) ,,} null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null怎么在Android中库模块生成类