从匕首 2 获取空实例

Getting null instance from dagger 2

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

我正在尝试在 @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;
}

}

当我像这样在我的服务中注入 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 中设置,但它一直为空,如您在上面所见。任何帮助,将不胜感激。谢谢

这是服务模块

@Module
class ServicesModule {

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

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

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

构造函数注入需要 class 被注入,在提供参数类型的组件中实例化。在你的情况下,因为你没有它,那么你的 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. 
}

因为您的 class 名称中包含服务。我假设你想要它的一个实例。您可以用 @Singleton 注释它,这样每次 userService() 调用 returns 同一个对象,否则它会创建一个新对象。

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

我在 ServicesModule 的方法中传递错误。所以我不得不用这样的方法传递它并且它起作用了:

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