gpt4 book ai didi

android - 从 Dagger 2 获取空实例

转载 作者:行者123 更新时间:2023-11-29 23:00:51 24 4
gpt4 key购买 nike

我正在开发一个应用程序,我在其中定义了多个层并使用 dagger2 进行实例管理等。我有管理器、服务和 View 。

我正在尝试在 @Module 中设置管理器,例如:

@Module
class ManagerModule {

@Provides
@Singleton
fun provideDatabaseContext(userManager: UserManager) : DatabaseContext {
var databaseContext : DatabaseContext = DatabaseContext();
databaseContext.setUserManager(userManager)
return databaseContext
}


@Provides
@Singleton
fun provideUserManager(store : PersistenceStore<DAOUser>) : UserManager = UserManager(store)
}

其中DatabaseContext是这样的:

class DatabaseContext : IDatabaseContext {


private lateinit var userManager: IUserManager


override fun getUserManager(): IUserManager {
return userManager;
}

fun setUserManager(userManager: IUserManager){
this.userManager = userManager;
}

}

当我像这样在我的服务中注入(inject) DatabaseContext 时:

class UserService @Inject constructor(var databaseContext: IDatabaseContext) : IUserService {





override fun addUser(dtoUser: DTOUser, callback: ResponseCallback<Response<Void>>) {


var daoUser : DAOUser = DAOUser(dtoUser.name, dtoUser.email, dtoUser.password)


databaseContext.getUserManager().add(daoUser);
callback.onCompletion(Response<Void>())
}
}

除 getUserManager() 外一切正常,即使我有 setUserManager 方法并且我在 ManagerModule 中进行设置,它始终为 null,如您在上面所见。任何帮助,将不胜感激。谢谢

这是服务模块

@Module
class ServicesModule {

@Provides
@Singleton
fun provideUserService() : UserService = UserService(DatabaseContext())

@Provides
@Singleton
fun provideAuthenticationService() : AuthenticationService = AuthenticationService(FirebaseAuth.getInstance())
}

最佳答案

我假设 null 实际上是 databaseContext 而不是 getUserManager()。因为我不确定您如何实例化 UserService

构造函数注入(inject)要求被注入(inject)的类在提供参数类型的组件中实例化。在你的情况下,因为你没有它,那么你的 UserService 实际上没有被注入(inject)。

此外,DatabaseContext 提供程序需要位于 userService() 所在的模块之一中,UserService 构造函数注入(inject)才能工作,这你已经有了。

@Singleton
@Component(modules = [ManagerModule::class]) // ManagerModule has DatabaseContext provider
class MyComponent {
fun userService(): UserService // this is how you get the instance of userService that is constructor injected.
}

因为你的类(class)名称中有服务。我假设你想要它的一个实例。您可以使用 @Singleton 对其进行注释,这样每次 userService() 调用都会返回相同的对象,否则会创建一个新对象。

@Singleton
class UserService @Inject constructor(var databaseContext: IDatabaseContext) : IUserService

关于android - 从 Dagger 2 获取空实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56940711/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com