마스터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,530 포인트) 님이 2023년 3월 3일 답변
spark님이 2023년 3월 4일 수정
어째저째 해서 그래들버전까진 올렸는데 그래도 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함수를 사용할 수 있는데, 에디터에서 문제가 있다는 말이죠? 에디터는 상황에 따라 잘못 표시될 수도 있어요.
...