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
相关产品推荐
相关产品推荐

