怎么在Android中库模块生成类

  介绍

这篇文章将为大家详细讲解有关怎么在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中库模块生成类