마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

AppcompatActivity에서 by viewModels() 안됩니다

0 추천

힐트를 넣으려고하는데, 토이플젝에는 되는게 회사플젝에선 안되더라구요 

implementation "androidx.activity:activity-ktx:1.5.0"
implementation "androidx.fragment:fragment-ktx:1.5.0"

implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"

이렇게도 추가해줬는데도 by viewModels()가 unresolved type mismatch로 나오다가

 액티비티 상속을 AppcompatActivity가 아닌 ComponentActivity로 받으니 되는데 왜 그런걸까요?

상속관계를 보면 ComponentActivity를 상속받았던데 왜 안되는지 모르겠습니다 반면에 토이플젝은 또 되니..  더모르겠네요

수원통학러 (3,570 포인트) 님이 2023년 3월 3일 질문

1개의 답변

0 추천

ComponentActivity를 보면

package androidx.activity;


public class ComponentActivity extends androidx.core.app.ComponentActivity implements
        ContextAware,
        LifecycleOwner,
        ViewModelStoreOwner,
        HasDefaultViewModelProviderFactory,
        SavedStateRegistryOwner,
        OnBackPressedDispatcherOwner,
        ActivityResultRegistryOwner,
        ActivityResultCaller,
        OnConfigurationChangedProvider,
        OnTrimMemoryProvider,
        OnNewIntentProvider,
        OnMultiWindowModeChangedProvider,
        OnPictureInPictureModeChangedProvider,
        MenuHost {

...

}

로 되어 있습니다. ComponentActivity가 클래스 이름은 같지만 패키지 이름은 다르네요. 따라서 아마도 ComponentActivity의 패키지명 때문에 헷갈리신 것 같아요. viewModels extension function은 androidx.activity.ComponentActivity의 extension function이구요.

 

spark (227,830 포인트) 님이 2023년 3월 3일 답변
spark님이 2023년 3월 4일 수정
AppcompatActivity로는 왜안되는걸까요? 토이플젝에선 Appcompatactivity로 했었는데 안되더라구요
androidx.activity.viewModels
androidx.appcompat.app.AppCompatActivity

가 임포트 된거 맞나요? support package나 이런 거 아니구요.
회사코드라 당장 볼순 없지만 저 두개가 맞을거에요 뷰모델은 by viewmodels가 되던 제토이플젝에서 복붙도 해본거라 맞고 액티비티도 그 안스에서 액티비티 만들어주는거로 만든거라서요 support임포트도 보지못했어요
그래들버전이 4.x.x 던데 이거랑은 연관이 없겠죠..?
이상하네요. 관련 디펜던시도 추가해줬고, import도 맞게 하셨다면 되야 할 것 같은데요.
안드로이드 스튜디오 버전이 너무 낮으면, 액티비티를 만들 때 기본템플릿의 코드가 예전 버전으로 되어 있을 가능성이 있어요. 4.x 버전이면 액티비티 생성하실 때, import가 예전 버전으로 되어 있을 수도 있을 것 같아요.
혹 모르니 아래 페이지에 가셔서 코틀린과 Gradle 버전 관계를 살펴보시고,
https://docs.gradle.org/current/userguide/compatibility.html

업그레이드 해서 테스트도 해보시는게 좋을 것 같네요.
일단 자바 + 코틀린이고, 6~7년이 쌓인 레거시다보니..
그래들을 올리면 외부 모듈?식으로 된 라이브러리들이 터져가지고..
올릴수가 없습니다 재개발이 빠를정도에요 ㅜㅜ

일단 제가 올린거라 기억하는건 코틀린은 1.6.10으로 올려놓긴했습니다.
by viewmodels한 액티비티도 코틀린으로 만들어놓긴했구요

주신페이지에서도 그래들버전이 5.0이 가장 낮은거로 보이는데.. 어떻게 해야될까여..
기존 코드들이 영향을 많이 받는다면 확실한 솔루션이 있을 때까지는 그 부분은 손대지 않는게 현명하다고 봅니다. viewModels같은 extension function은 아마도 Activty가 다른 클래스라서 인식이 안되는 문제일 거 같구요, Gralde 문제일 것 같지는 않지만, 정 안된다면 해당 라이브러리의 소스코드에서 일단 카피해서 사용하는게 임시 방편일 거 같네요. 중장기적으로는 시간을 들이셔셔 Gradle 버전을 올릴 수 있도록 디펜던시 문제가 생기는 라이브러리들을 하나씩 테스트해 보시는게 좋을 것같습니다. 추가로 개발자가 한두명이라면 멀티모듈같은 구조를 사용하는건 유지보수를 오히려 상당히 힘들게 할 수 있습니다. 그리고 라이브러리가 한두가지 간단한 기능만 사용한다면 필요한 부분만 빼내서 별도로 옮기고 제거하는 방법도 고려해 보시기 바랍니다. 특히 third party 라이브러리의 경우는 꼭 써야하는 하는지 면밀하게 검토해 보시기 바랍니다.
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
를 임포트하고 있는데 by viewmodels가 안되네용
정말 그래들문제밖에 없는걸까요 이러면..?

classpath 'com.android.tools.build:gradle:4.2.2'
ext.kotlin_version = '1.6.10'
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.44'
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip

이렇게 쓰고있습니다.
서드파티인데, 쓰는기능인지라 뺄수가 없는상태인거같아요..
viewModels 함수는 ActivityViewModelLazy.kt 파일에 들어있는 함수입니다. Activity-ktx에 해당 파일과 함수가 존재한다면 인식이 되어야 겠죠.
몇번을 클린리빌드 리스타트해도 안됩니다ㅜㅜ
안드로이드 스튜디오 프로젝트 뷰에서 activity-ktx가 제대로 포함되었는지 확인하시고 해당 함수가 포함되어있는지도 체크해 보세요.
implementation "androidx.activity:activity-ktx:1.5.0" 이거말씀하시는거 맞으실까요?
어째저째 해서 그래들버전까진 올렸는데 그래도 by viewmodels()가 안되네요
Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
public inline fun <reified VM : ViewModel> ComponentActivity.viewModels(noinline extrasProducer: (() → CreationExtras)? = ..., noinline factoryProducer: (() → ViewModelProvider.Factory)? = ...): Lazy<TypeVariable(VM)> defined in androidx.activity

해당 에러메시지입니다.

여전히 ComponentActivity에서만 by viewmodels가 됩니다..
안드로이드스튜디오에서 project struceture 들어가서 project탭에서 볼 수 있는 그래들버전
android gradle plugin version은 7.3.0
gradle version은 7.4.2
코틀린 version은 1.7.20 이렇게 맞춰줬습니다
Gradle 설정이 아니라, 프로젝트뷰에서 프로젝트에서 사용하는 모든 디펜던시를 .claa까지 볼 수 있어요. 해당 뷰의 트리 아래쪽에 보시면 generated classes(?) 인가로 되어 있는 항목이 있어요.
혹시 sync now는 하셨죠.
sync now는 했고 generate classes가 프로젝트뷰에도 안보이는데..
external libraries는 아닌거죠? 또 신기한게.. 미스 매치인데도 무시하고 빌드하면 정상적으로 호출을 하고있습니다.
실제로는 viewModels함수를 사용할 수 있는데, 에디터에서 문제가 있다는 말이죠? 에디터는 상황에 따라 잘못 표시될 수도 있어요.
...