我使用Dagger-Hilt进行依赖注入,但是我不知道如何在抽象类中进行字段注入。
// @ViewModelScoped
abstract class BaseUseCase<Params, Return>{
// lateinit var not initiazlied. Cannot be injected
@Inject
lateinit var errorHandler: ErrorHandler
fun execute(@nullable params: Params?=null): Flow<DataState<Return>> = flow {
emit(Datastate.Loading)
emit(executeRealization(params))
...
}.catch{ e->
when(e){
...
is Exception -> {
...
errorHandler.handleError(e.message ?: "Unknown Error")
}
}
}
protected abstract fun executeRealization(@Nullable params: Params?=null): DataState<Return>
}
[DI包]
>
我尝试使用匕首柄(如BaseUseCaseModule.kt)提供或绑定BaseUseCase类,但是由于它具有类型参数,因此无法绑定和提供。
目前我无法在 BaseUseCase 类中注入 errorHandler,所以只需编写 ErrorHandler 'object' 并静态使用它。(例如 Object ErrorHandler {})
问题
如何在抽象类内部进行字段注入?
目前不支持此操作。
可以考虑使用这两种方法重构代码。
第一种方法
将异常/错误处理向UI的方向移动,这将包括ViewModel方法。
这样,您就可以构造函数注入错误处理程序,然后执行UseCase并将处理程序包装起来。
让我们看一个可能的解决方案,在草图中,我们将使用干净的架构方法;
ViewModel.kt
@HiltViewModel
class YourViewModel @Inject constructor(private val errorHandler: ErrorHandler, private val useCase : SpecificUseCase) : ViewModel(){
suspend fun realizationFunction(params : Params?=null) : Flow<DataState<Return>> = flow {
emit(Datastate.Loading)
try{
emit(useCase(params))
}catch(exception : Exception){
errorHandler.handleError(e.message ?: "Unknown Error")
}
}
}
在您的特定用例中,我确实建议您使用存储库模式来执行您的函数,以分离关注点,而不是在用例中执行您的功能。
第二种方法
这种方法涉及将错误处理程序更深入地引入链中,并将构造函数注入您的错误处理程序到您的存储库实现中。
这将使您有机会在try/catch中运行特定的函数/服务调用,并在那里处理您的错误。
第二种方法的缺点可能包括返回错误结果的挑战,但合并资源类将使其无缝-似乎您已经有了一个,DataState。
class YourRepositoryImpl(private val errorHandler: ErrorHandler) : YourRepositoryInterface {
override suspend fun doSomething(params : Params?) : Flow<DataState<Return>> {
//call your function and use the error handler
}
}
这将为您提供更干净的代码和更好的错误处理。
还是我错过了什么?
您可能有兴趣阅读更多关于应用程序架构和关注点分离的信息。
我正在尝试为我的navControl ler提供匕首柄。但是我使用的方法不起作用。我想提供navControl ler以便通过构造函数注入将其注入我的片段中。 我还创建了FragmentWorks类,以便通过构造函数注入我的依赖项。我知道是这里的问题,但我不知道正确的解决方案… 感谢您的帮助,谢谢! 原因:java.lang.ClassCastException:com.example.app。应
基本上我正在从匕首迁移到剑柄。所以我必须删除这个参数 所以,我想从我的匕首剑柄模块传递应用程序类对象的地方很少。 很少有第三部分库。 法典: 像这样的地方很多。那么我该如何实现这一点呢? 编辑:
我是Android开发新手,需要为大学建立我的第一个项目。大学用的是旧版本的XML和Java,但是我想学Compose,所以我学了Kotlin。 现在,在设置好一切之后,我试图使用hiltViewModel()方法将视图模型注入到可组合函数中,但我得到了一个错误。我看了这个教程:https://www.youtube.com/watch?v=A7CGcFjQQtQ 在让这个工作之后。现在它说找不到
我是新来的,用匕首。所以,我不能解决这个有什么问题。我只想问在这里解决它。 这是错误: c:\ Users \ MSI \ Documents \ MyAndroidProjects \ movie projects \ App \ build \ generated \ hilt \ component _ sources \ debug \ com \ example \ movie App
我想在单元测试模块中使用我的领域管理器。我做的 然后我想实现 但是realmManager为空。如何使用匕首2编写简单的模块测试?我用了匕首模拟,但没有用。我的模块包含 我尝试了谷歌的一切,但我不知道如何从图形中注入对象。
我目前正在尝试将匕首2集成到一个Android应用程序中。我的项目设置如下: 库 应用程序(取决于库) 在我的library项目中,我定义了一个类,以后我将把它注入到库和app项目中需要它的其他类(活动和常规类)中。 我也是这么想的,因为实际上myManager总是空的。很明显,它的构造函数也从来没有被调用过,所以我想我一定遗漏了一些配置方面的东西?或者也许我误解了文档,它根本不是这样工作的?My