Kotlin,无法创建 Viewmodel 类的实例

问题描述 投票:0回答:1

我是 MVVM 架构的新手,我尝试过不同的选项,但仍然得到相同的异常“无法创建实例 ViewModel”。 我正在使用 Android Studio Iguana

下面是我的视频活动:

class VideoActivity : AppCompatActivity() {
    private lateinit var viewModel: VideoViewModel
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewModel = ViewModelProvider(this).get(VideoViewModel::class.java)
        
        val videos= listOf(
            Video(id = 1, url = "url1.mp4"),
            Video(id = 1, url = "url2.mp4"),
            Video(id = 1, url = "url3.mp4"),
            Video(id = 1, url = "url4.mp4"),
            Video(id = 1, url = "url5.mp4"),
        )

        viewModel.downloadVideos(videos)

        viewModel.videos.observe(this) { downloadedVideos ->
            if (downloadedVideos.isNotEmpty()) {
                viewModel.playNextVideo()
            }
        }
    }
}

下面是我的 VideoRepository 类

    class VideoRepository(private val context: Context) {
       
        suspend fun downloadVideos(videos: List<Video>): List<Video> {
            val downloadedVideos = mutableListOf<Video>()
            for (video in videos) {
                val filePath = downloadVideo(video.url)
                if (filePath.isNotBlank()) {
                    video.downloadStatus = DownloadStatus.DOWNLOADED
                    video.filePath = filePath
                    downloadedVideos.add(video)
                }
            }
            return downloadedVideos
        }
    
        private suspend fun downloadVideo(videoUrl: String): String = withContext(Dispatchers.IO) {
            try {
                val url = URL(videoUrl)
                val connection = url.openConnection() as HttpURLConnection
                connection.connect()
    
                val inputStream: InputStream = connection.inputStream
                val file = File(context.getExternalFilesDir(Environment.DIRECTORY_MOVIES), "video_${System.currentTimeMillis()}.mp4")
                val outputStream = FileOutputStream(file)
    
                val buffer = ByteArray(1024)
                var bytesRead: Int
                while (inputStream.read(buffer).also { bytesRead = it } != -1) {
                    outputStream.write(buffer, 0, bytesRead)
                }
    
                outputStream.flush()
                outputStream.close()
                inputStream.close()
    
                file.absolutePath
            } catch (e: Exception) {
                e.printStackTrace()
                ""
            }
        }
    
        fun playVideo(video: Video) {
            val videoView = (context as VideoActivity).findViewById<VideoView>(R.id.video_view)
            videoView.setVideoURI(Uri.parse(video.filePath))
            videoView.start()
        }
    }

class VideoViewModel(var repository: VideoRepository) : ViewModel(){

    private val _videos = MutableLiveData<List<Video>>()
    val videos:LiveData<List<Video>> = _videos

    private lateinit var videoView: VideoView

    private var currentVideoIndex = 0
    fun downloadVideos(videos: List<Video>){
        viewModelScope.launch {
            val downloadVideos = repository.downloadVideos(videos)
            _videos.postValue(downloadVideos)
        }
    }

    fun playNextVideo(){
        currentVideoIndex = (currentVideoIndex + 1) % (videos.value?.size ?: 1)
        val video = videos.value?.get(currentVideoIndex)
        video?.let{
            repository.playVideo(it)
        }
    }  
}

应用程序 Gradle 依赖项:

implementation(libs.androidx.core.ktx)
implementation(libs.androidx.lifecycle.runtime.ktx)
implementation(libs.androidx.activity.compose)
implementation(platform(libs.androidx.compose.bom))
implementation(libs.androidx.ui)
implementation(libs.androidx.ui.graphics)
implementation(libs.androidx.ui.tooling.preview)
implementation(libs.androidx.material3)

implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1")
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.3.1")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0")
implementation(libs.androidx.appcompat)

以下是我遇到的异常

Process: com.android, PID: 4717
                                                                                                    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android/com.android.main.VideoActivity}: java.lang.RuntimeException: Cannot create an instance of class com.android.main.VideoViewModel
                                                                                                        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3825)
                                                                                                        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3971)
                                                                                                        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101)
                                                                                                        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
                                                                                                        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
                                                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2389)
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:106)
                                                                                                        at android.os.Looper.loopOnce(Looper.java:210)
                                                                                                        at android.os.Looper.loop(Looper.java:299)
                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:8261)
                                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:559)
                                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:954)
                                                                                                    Caused by: java.lang.RuntimeException: Cannot create an instance of class com.android.main.VideoViewModel
                                                                                                        at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:201)
                                                                                                        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:320)
                                                                                                        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:302)
                                                                                                        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:276)
                                                                                                        at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:128)
                                                                                                        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:184)
                                                                                                        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:150)
                                                                                                        at com.android.main.VideoActivity.onCreate(VideoActivity.kt:20)
                                                                                                        at android.app.Activity.performCreate(Activity.java:8516)
                                                                                                        at android.app.Activity.performCreate(Activity.java:8480)
                                                                                                        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1418)
                                                                                                        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3806)
                                                                                                        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3971) 
                                                                                                        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101) 
                                                                                                        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
                                                                                                        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
                                                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2389) 
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:106) 
                                                                                                        at android.os.Looper.loopOnce(Looper.java:210) 
                                                                                                        at android.os.Looper.loop(Looper.java:299) 
                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:8261) 
                                                                                                        at java.lang.reflect.Method.invoke(Native Method) 
                                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:559) 
                                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:954) 
                                                                                                    Caused by: java.lang.NoSuchMethodException: com.android.adbeets.main.VideoViewModel.<init> []
                                                                                                        at java.lang.Class.getConstructor0(Class.java:3325)
                                                                                                        at java.lang.Class.getDeclaredConstructor(Class.java:3063)
                                                                                                        at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:199)
                                                                                                        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:320) 
                                                                                                        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:302) 
                                                                                                        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:276) 
                                                                                                        at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:128) 
                                                                                                        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:184) 
                                                                                                        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:150) 
                                                                                                        at com.android.adbeets.main.VideoActivity.onCreate(VideoActivity.kt:20) 
                                                                                                        at android.app.Activity.performCreate(Activity.java:8516) 
                                                                                                        at android.app.Activity.performCreate(Activity.java:8480) 
                                                                                                        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1418) 
                                                                                                        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3806) 
                                                                                                        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3971) 
                                                                                                        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101) 
                                                                                                        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
                                                                                                        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
                                                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2389) 
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:106) 
                                                                                                        at android.os.Looper.loopOnce(Looper.java:210) 
                                                                                                        at android.os.Looper.loop(Looper.java:299) 
                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:8261) 
                                                                                                        at java.lang.reflect.Method.invoke(Native Method) 
                                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:559) 
                                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:954) 
2024-04-09 12:06:35.424 24478-30209 ActivityManagerWrapper  com.miui.home                        E

有人可以帮我解决这个问题吗? 提前致谢

android kotlin mvvm android-mvvm
1个回答
0
投票

您的 viewModel 定义是旧的,请尝试使用新方法来初始化您的 viewModel。

将这些依赖项添加到您的项目中;

def activity_version = "1.8.2"
implementation "androidx.activity:activity-ktx:$activity_version"

删除你的

viewModel = ViewModelProvider(this).get(VideoViewModel::class.java)
线

将您的

private lateinit var viewModel: VideoViewModel
更新为
private val viewModel: VideoViewModel by viewModels()

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.