作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的代码中,我有这样的内容:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
presenter.onCreate()
fabContainer.onClick {
presenter.onLoginButtonClicked(...)
}
}
当我反编译apk并检查字节码时,会出现如下内容:
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 字节代码吗?我认为 lambda 被解析为调用它们的类内的静态方法。
最佳答案
如果 lambda 不引用周围上下文中的任何内容,则它会被编译为静态方法。
在您的示例中,您引用的是 presenter
,它是事件类的实例字段。为了在 onClick 处理程序中捕获该引用,需要创建一个新类的实例(在本例中,Kotlin 捕获对 Activity 类的引用并通过其属性访问演示者)。
无论是使用 Kotlin 还是使用纯 Java,都无法避免在此处创建额外的类。
关于lambda - Kotlin 为 lambda 生成内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41164487/
我是一名优秀的程序员,十分优秀!