我在 Android 上从事一些大型项目,该项目最初 100% 用 Java 编写。当我将一些文件转换为 Kotlin 时,我发现至少有 2 种情况文档和代码声明某些函数的某些参数应该为非空,因此我也让它们在 Kotlin 上保持这种方式:
这意味着它们看起来像这样:
boolean onFling(@NonNull MotionEvent e1, @NonNull MotionEvent e2, float velocityX, float velocityY);
Run Code Online (Sandbox Code Playgroud)
我通过 Crashlytics 注意到,这两种情况实际上会导致某些设备崩溃,因为它们实际上获取的是 null 值,因为 Kotlin 对此类事情非常严格(当参数设置为非 null 时获取 null)。
我已经在问题跟踪器(此处和此处)上报告了这一点,并且我尝试找到如何强制 Kotlin 允许参数可以为空,尽管背后的代码表明它们不能为空。可悲的是,它总是会导致“'onFling'覆盖任何内容”的错误,并且不会让我构建它。
我不知道如何做,所以现在我使用 Java。意思是这样的:
public class SimpleOnGestureListenerCompat extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onFling(@Nullable final MotionEvent e1, @Nullable final MotionEvent e2, final float velocityX, final float velocityY) {
return super.onFling(e1, e2, velocityX, velocityY);
}
} …
Run Code Online (Sandbox Code Playgroud) 我已经在我的 Activity 上实现了 GestureDetector.OnGestureListener 接口。它在 Android API 32 上运行良好,但在将 Android API 级别从 32 更新到 33 后,我无法覆盖它的方法。当我回滚到 Android API 32 时,它工作正常。
这是我实现该接口的方式:
class ABCActivity: AppCompatActivity(), GestureDetector.OnGestureListener {
override fun onDown(p0: MotionEvent?): Boolean = false
override fun onShowPress(p0: MotionEvent?) = Unit
override fun onSingleTapUp(p0: MotionEvent?): Boolean = false
override fun onLongPress(p0: MotionEvent?) = Unit
override fun onFling(p0: MotionEvent?, p1: MotionEvent?, p2: Float, p3: Float): Boolean = false
override fun onScroll(
event: MotionEvent?,
event1: MotionEvent?,
distanceX: Float,
distanceY: Float
): Boolean {
// …
Run Code Online (Sandbox Code Playgroud)