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

Android匕首-刀柄抽象类如何做字段注入?

米楷
2023-03-14

我使用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包]

  • 我使用匕首剑柄(AppModule.kt)将“ErrorHandler”作为单例提供
  • 扩展到BaseUseCase以上的用例都是为匕首剑柄(UseCaseModule.kt)编写的。

>

  • 我尝试使用匕首柄(如BaseUseCaseModule.kt)提供或绑定BaseUseCase类,但是由于它具有类型参数,因此无法绑定和提供。

    目前我无法在 BaseUseCase 类中注入 errorHandler,所以只需编写 ErrorHandler 'object' 并静态使用它。(例如 Object ErrorHandler {})

    问题

    1. 如何在抽象类中进行字段注入?
    2. 还是我错过了什么?
  • 共有1个答案

    缑勇锐
    2023-03-14

    如何在抽象类内部进行字段注入?

    目前不支持此操作。

    可以考虑使用这两种方法重构代码。

    第一种方法

    将异常/错误处理向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