当前位置: 首页 > 知识库问答 >
问题:

无法创建类视图模型句柄的实例

田巴英
2023-03-14

我在我的词典应用程序中使用了第一个刀柄,但是当我运行我的应用程序时,它会崩溃并显示此日志:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: ir.arinateam.dictionary, PID: 23787
    java.lang.RuntimeException: Cannot create an instance of class ir.arinateam.dictionary.feature_dictionary.presentation.WordInfoViewModel
        at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:204)
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:322)
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:304)
        at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:175)
        at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:138)

这是我的模块类:`@ Module @ InstallIn(singleton component::class)object word info Module {

@Provides
@Singleton
fun provideGetWordInfoUseCase(repository: WordInfoRepository): GetWordInfo {
    return GetWordInfo(repository)
}

@Provides
@Singleton
fun provideWordInfoDatabase(app: Application): WordInfoDatabase {
    return Room.databaseBuilder(
        app.applicationContext, WordInfoDatabase::class.java, "word_db"
    ).addTypeConverter(Converters(GsonParser(Gson())))
        .build()
}

@Provides
@Singleton
fun provideWordInfoRepository(
    db: WordInfoDatabase,
    api: DictionaryApi
): WordInfoRepository {
    return WordInfoRepositoryImpl(api, db.dao)
}

@Provides
@Singleton
fun provideDictionaryApi(): DictionaryApi {
    return Retrofit.Builder()
        .baseUrl(DictionaryApi.BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build()
        .create(DictionaryApi::class.java)
}



}`

这是我的主活动类,它初始化视图模型并尝试使用它:

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

private lateinit var bindingActivity: ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    bindingActivity = DataBindingUtil.setContentView(this, R.layout.activity_main)

    val viewModel: WordInfoViewModel by viewModels {
        SavedStateViewModelFactory(application, this)
    }
    
    lifecycleScope.launch {

        viewModel.eventFlow.collectLatest { event ->

            when (event) {

                is WordInfoViewModel.UIEvent.ShowSnackbar -> {
                    Snackbar.make(bindingActivity.root, event.message, Snackbar.LENGTH_SHORT)
                        .show()
                }

            }

        }

    }
}
}

这是我的观点模型:

@HiltViewModel
class WordInfoViewModel @Inject constructor(
private val getWordInfo: GetWordInfo
) : ViewModel() {

private val _searchQuery = mutableStateOf<String>("")
val searchQuery: State<String> = _searchQuery

private val _state = mutableStateOf<WordInfoState>(WordInfoState())
val state: State<WordInfoState> = _state

private val _eventFlow = MutableSharedFlow<UIEvent>()
val eventFlow = _eventFlow.asSharedFlow()

private var searchJob: Job? = null

fun onSearch(query: String) {

    _searchQuery.value = query
    searchJob?.cancel()
    searchJob = viewModelScope.launch {
        delay(500L)
        getWordInfo(query)
            .onEach { result ->
                when (result) {
                    is Resource.Success -> {
                        _state.value = state.value.copy(
                            wordInfoItems = result.data ?: emptyList(),
                            isLoading = false
                        )
                    }
                    is Resource.Error -> {
                        _state.value = state.value.copy(
                            wordInfoItems = result.data ?: emptyList(),
                            isLoading = false
                        )
                        _eventFlow.emit(UIEvent.ShowSnackbar(result.message ?: "Unknown Error"))
                    }
                    is Resource.Loading -> {
                        _state.value = state.value.copy(
                            wordInfoItems = result.data ?: emptyList(),
                            isLoading = true
                        )
                    }
                }
            }.launchIn(this)
    }

}

sealed class UIEvent {
    data class ShowSnackbar(val message: String) : UIEvent()
}

}

问题出在哪里,怎么解决?

共有2个答案

贲俊才
2023-03-14

Hilt允许您将SavedStateHandle注入视图模型,您可以将其用作:

@HiltViewModel
class WordInfoViewModel @Inject constructor(
    private val savedStateHandle: SavedStateHandle,
    private val getWordInfo: GetWordInfo
) : ViewModel() {
    ...
}

在您的活动中:

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    private val viewModel: WordInfoViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) { ... }
}

如果您对still alpha库感到满意:

implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03'
越心水
2023-03-14

在您的活动中,您现在可以直接使用KTX viewModels()。

 val viewModel: WordInfoViewModel by viewModels {
        SavedStateViewModelFactory(application, this)
    }

将该部件更换为

private val viewModel: MyViewModel by viewModels()
 类似资料:
  • 要在OpenGL中使用无绑定图像,需要使用glGetImageHandleARB创建GLuint64句柄。然后,可以将此句柄设置为统一的image2D变量,并使用图像,就像使用旧方法绑定一样。没问题。使用纹理/采样器,还可以将(纹理)控制柄设置为普通统一的uint64_t变量,而不是sampler2D。然后,可以使用该句柄在运行时使用构造函数sampler2D(句柄)来“构造”采样器对象。 扩展描

  • 我知道这个问题已经在这里和这里被问过了,但我仍然无法创建带有手柄的导航抽屉。 我使用了下面提到的类:: DrawerHandle:: 我仍然无法得到想要的输出:: 到目前为止我所做的: 主活动:: 活动_main。xml 到目前为止,我得到了: 现在,当我点击抽屉把手图标时,我得到了以下错误。。。 Logcat:: 请让我知道你的宝贵建议。 任何链接/指导都将是有帮助的...... 提前感谢。。。

  • 我在一次测试中试图使用一个模拟类,但出现了以下错误: 在pom中: (也试用了3.0.0版) 车辆等级: 测试类:

  • 当你用作图命令时,MATLAB用多种图形对象创建图形,例如线,文本,表面(完整列表见Graphics Objects)。所有图形对象都有控制其性能的属性。你可以在MATLAB中询问每种属性的取值并设置大部分的属性值。 每当MATLAB创建一个图形对象时,它就给该对象赋以一个标识符(称为句柄)。可以用此句柄访问对象属性。若你想作下列操作,句柄图形很有用。 修改图形外观。 通过编写能直接创建和操作对象

  • 我正在开发一本新书android应用程序,但当我测试从logcat获取以下异常的代码时,应用程序崩溃 hread.mainRuntimeException:无法启动活动ComponentInfo{hread.java:6662}:java.lang.reflect.RuntimeException:无法创建ethod.invokeBookViewModel类的实例com.android.inter