在我的代码中,我有类似的东西:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
presenter.onCreate()
fabContainer.onClick {
presenter.onLoginButtonClicked(...)
}
}
当我反编译apk并检查byteCode时,会显示如下内容:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.presenter.onCreate();
Sdk23ListenersKt.onClick((ProgressFloatingActionButton) _$_findCachedViewById(com.prozis.prozisgo.prozisgo.R.id.fabContainer), new ActAuthLogin$onCreate$1(this));
}
final class ActAuthLogin$onCreate$1 extends Lambda implements Function1<View, Unit> {
final /* synthetic */ ActAuthLogin this$0;
ActAuthLogin$onCreate$1(ActAuthLogin actAuthLogin) {
this.this$0 = actAuthLogin;
super(1);
}
public final void invoke(View it) {
this.this$0.getPresenter().onLoginButtonClicked(StringsKt__StringsKt.trim(((EditText) this.this$0._$_findCachedViewById(R.id.email)).getText()).toString(), StringsKt__StringsKt.trim(((EditText) this.this$0._$_findCachedViewById(R.id.password)).getText()).toString(), ((CheckBox) this.this$0._$_findCachedViewById(R.id.rememberEmail)).isChecked());
}
}
为什么要创建这个类,我该如何避免它?这是普通的Kotlin字节代码,我认为lambdas被解析为它们被调用的类中的静态方法。
答案 0 :(得分:4)
如果lambda不引用周围上下文中的任何内容,则将其编译为静态方法。
在您的示例中,您引用了presenter
,这是活动类的实例字段。为了在onClick
处理程序中捕获该引用,创建新类的实例是必要的(在这种情况下,Kotlin捕获对活动类的引用并通过其属性访问呈现器)
无论是使用Kotlin还是使用普通Java,都无法避免在这里创建额外的类。