有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓 hilt中的java依赖循环

我是个新手,我想在Android应用程序中使用它。问题是,在构建过程中,我得到了一个依赖循环,我不确定如何解决这个问题

基本思想是我有一个本地数据库,我想把它注入到活动中。我有一个活动,它定义了一个工具栏,本地数据库是由工具栏触发的操作所必需的,然后我有一个活动扩展了这个活动,我在其中注入了其他东西

以下是一些代码作为示例:

@Singleton
public class LocalDatabase{
    ...
}

@Module
@InstallIn(SingletonComponent.class)
public abstract class LocalDatabaseModule {

    @Singleton
    @Binds
    public abstract LocalDatabase bindLocalDatabaseService(LocalDatabase localDatabase);
}

@AndroidEntryPoint
public abstract class ToolbarActivity extends AppCompatActivity {
    @Inject
    LocalDatabase localdb;

    ...
}

@AndroidEntryPoint
public class LoginActivity extends ToolbarActivity {

    @Inject
    LoginService login;

    ...
}

遗憾的是,活动层次结构尚未由我决定,因此我无法修改它(其他活动必须扩展ToolbarActivity)

我得到的错误是:

public abstract static class SingletonC implements HiltApplication_GeneratedInjector,
                         ^
      app.database.local.LocalDatabase is injected at
          app.hilt.LocalDatabaseModule.bindLocalDatabaseService(localDatabase)
      app.database.local.LocalDatabase is injected at
          app.ToolbarActivity.localdb
      app.LoginActivity is injected at
app.ScrollingActivity_GeneratedInjector.injectScrollingActivity(app.ScrollingActivity)[app.hilt.HiltApplication_HiltComponents.SingletonC ? app.hilt.HiltApplication_HiltComponents.ActivityRetainedC ? app.hilt.HiltApplication_HiltComponents.ActivityC]

我真的很难理解周期在哪里,因此,我不知道如何避免这个问题。在引入本地DB代码之前,其他注入工作正常


共 (2) 个答案

  1. # 1 楼答案

    通过为本地数据库创建接口并使用该类进行依赖项注入,解决了这些问题。我不知道为什么我没有这样做,因为这就是我在其他注入类中所做的

    public interface LocalDatabaseService {
        ...
    }
    
    @Singleton
    public class LocalDatabase implements LocalDatabaseService {
        @Inject
        public LocalDatabase(){
            ...
        }
    
        ...
    }
    
    @Module
    @InstallIn(SingletonComponent.class)
    public abstract class LocalDatabaseModule {
    
        @Singleton
        @Binds
        public abstract LocalDatabaseService bindLocalDatabaseService(LocalDatabase localDatabase);
    }
    
  2. # 2 楼答案

    Hilt需要localDatabase来创建bindLocalDatabaseService。 我希望下面的代码将工作

            @Module
            @InstallIn(SingletonComponent.class)
    
            @Singleton
            @Provides 
            public LocalDatabase provideLocalDatabase(){
                return LocalDataBase;
            }
            
            
                @Singleton
                @Binds
                public abstract LocalDatabase bindLocalDatabaseService(LocalDatabase localDatabase){
            }