You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Inventory App添加搜索栏崩溃:SearchResultViewModel未设初始化器

问题解决:SearchResultViewModel 初始化失败导致崩溃

你的崩溃原因很明确:AppViewModelProvider 中没有为 SearchResultViewModel 添加初始化器,系统无法创建该ViewModel的实例,因此抛出了No initializer set for given class异常。

修复步骤

修改 AppViewModelProvider 类,在 Factory 中补充 SearchResultViewModel 的初始化代码:

package com.example.inventory.ui

import android.app.Application
import androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory
import androidx.lifecycle.createSavedStateHandle
import androidx.lifecycle.viewmodel.CreationExtras
import androidx.lifecycle.viewmodel.initializer
import androidx.lifecycle.viewmodel.viewModelFactory
import com.example.inventory.InventoryApplication
import com.example.inventory.ui.home.HomeViewModel
import com.example.inventory.ui.item.ItemDetailsViewModel
import com.example.inventory.ui.item.ItemEditViewModel
import com.example.inventory.ui.item.ItemEntryViewModel
import com.example.inventory.ui.searchResultScreen.SearchResultViewModel

/**
 * Provides Factory to create instance of ViewModel for the entire Inventory app
 */
object AppViewModelProvider {
    val Factory = viewModelFactory {
        // Initializer for ItemEditViewModel
        initializer {
            ItemEditViewModel(
                this.createSavedStateHandle(),
                inventoryApplication().container.itemsRepository
            )
        }
        // Initializer for ItemEntryViewModel
        initializer {
            ItemEntryViewModel(inventoryApplication().container.itemsRepository)
        }

        // Initializer for ItemDetailsViewModel
        initializer {
            ItemDetailsViewModel(
                this.createSavedStateHandle(),
                inventoryApplication().container.itemsRepository
            )
        }

        // Initializer for HomeViewModel
        initializer {
            HomeViewModel(inventoryApplication().container.itemsRepository)
        }

        // 添加SearchResultViewModel的初始化器
        initializer {
            SearchResultViewModel(
                this.createSavedStateHandle(),
                inventoryApplication().container.itemsRepository
            )
        }
    }
}

/**
 * Extension function to queries for [Application] object and returns an instance of
 * [InventoryApplication].
 */
fun CreationExtras.inventoryApplication(): InventoryApplication =
    (this[AndroidViewModelFactory.APPLICATION_KEY] as InventoryApplication)

额外验证点

确认导航到SearchResultScreen时,已正确将searchQuery参数传入SavedStateHandle(比如在导航图中定义了对应参数,且跳转时传递了有效值),否则checkNotNull(savedStateHandle[SearchResultDestination.searchQueryArg])会触发空指针异常。

内容的提问来源于stack exchange,提问作者Ajew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 22:03:20