'create' overrides nothing문제 상황버즈캐시버튼의 종속성을 추가한 상태에서 빌드할 때, 다음과 같은 에러 메시지가 발생하면서 빌드에 실패할 수 있습니다. 'create' overrides nothing
조금 더 구체적으로는 다음과 같은 메시지를 받을 수 있습니다. Class 'ViewModelFactory' is not abstract and does not implement abstract member public abstract fun <T : ViewModel> create(modelClass: Class<T>): T defined in androidx.lifecycle.ViewModelProvider.Factory
문제 설명기존에 androidx.lifecycle 모듈을 2.2.0 이하 버전을 사용하면서 코틀린으로 ViewModelProvider.Factory 를 상속한 객체를 구현하고 있었던 경우, 버즈캐시버튼을 연동하면서 버전이 2.4.0 이후 버전으로 올라갔기 때문에 발생합니다. androidx.lifecycle 모듈은 2.4.0에서 다음과 같은 하위호환성이 깨지는 변화가 있었습니다. 하위호환성이 깨지는 변화: ViewModelProvider 가 코틀린으로 재작성되었습니다. ViewModelProvider.Factory.create 함수는 더 이상 nullable 제네릭을 허용하지 않습니다.
해결 방법코드에 다음과 같이 nullable한 타입으로 ViewModelProvider.Factory.create 함수를 사용하는 경우를 찾습니다. Code Block |
---|
class SomeViewModelFactory(): ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
....
}
} |
다음과 같이 create 함수가 nullable한 제네릭을 사용하지 않도록 변경합니다. (? 가 제거되었습니다.) Code Block |
---|
class SomeViewModelFactory(): ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
....
}
} |
관련 문서Inheritance from an interface with '@JvmDefault' members is only allowed with -Xjvm-default option문제 상황버즈캐시버튼의 종속성을 추가한 상태에서 빌드할 때, 다음과 같은 에러 메시지가 발생하면서 빌드에 실패할 수 있습니다. Inheritance from an interface with '@JvmDefault' members is only allowed with -Xjvm-default option
문제 설명기존에 androidx.lifecycle 모듈을 2.5.0 미만의 버전을 사용하면서 코틀린으로 ViewModelProvider.Factory 를 상속한 객체를 구현하고 있었던 경우, 버즈캐시버튼을 연동하면서 버전이 2.5.0 이후 버전으로 올라갔기 때문에 발생합니다. androidx.lifecycle 모듈은 2.5.0-alpha01 에서 하위호환성이 깨지는 변화가 있었고, 이로 인해 이 문제가 발생한다고 합니다. 해결 방법다음 두 가지 해결 방법 중 적절한 방법을 골라서 적용합니다. 앱 수준의 build.gradle 파일에 다음을 추가합니다. Code Block |
---|
android {
...
kotlinOptions {
...
freeCompilerArgs += [
"-Xjvm-default=all",
]
}
} |
코틀린 버전을 1.6.20 버전 이상으로 올립니다.
관련 문서 |