从匕首2获取空实例

时间:2019-07-08 18:32:13

标签: android kotlin dagger-2

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

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

WIN64

其中的DatabaseContext是这样的:

@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;
}

}

除了getUserManager()始终为空的所有工作正常,即使我有setUserManager方法并且我在ManagerModule中进行了设置(如上所示)。任何帮助,将不胜感激。谢谢

这是ServicesModule

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>())
}
}

2 个答案:

答案 0 :(得分:1)

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

构造函数注入要求注入的类要在提供参数类型的组件中实例化。在您的情况下,由于您没有,所以您的UserService实际上没有被注入。

另外,DatabaseContext提供者必须位于userService()所在的模块之一中,UserService构造函数注入才能正常工作。

@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. 
}

由于您的班级名称中包含Service。我假设您想要一个实例。您可以使用@Singleton对其进行注释,以便每个userService()调用都返回相同的对象,否则它将创建一个新的对象。

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

答案 1 :(得分:0)

我在ServicesModule方法中传递了错误。所以我必须以这种方法传递它,然后它才能起作用:

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