android 刀柄中的依赖循环

Dependency cycle in android hilt

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

基本思路是我有一个本地数据库,我想把它注入到活动中。我有一个 activity 定义了一个工具栏,并且那里需要本地数据库来执行由工具栏触发的操作,然后我有一个 activity 扩展那个我在其中注入其他东西的数据库。

这里有一些代码作为例子:

@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]

我真的很难理解循环在哪里,因此,我不确定如何避免这个问题。在引入 Local DB 代码之前,其他注入工作正常。

Hilt 需要 localDatabase 来创建 bindLocalDatabaseService。 我希望下面的代码能起作用。

        @Module
        @InstallIn(SingletonComponent.class)

        @Singleton
        @Provides 
        public LocalDatabase provideLocalDatabase(){
            return LocalDataBase;
        }
        
        
            @Singleton
            @Binds
            public abstract LocalDatabase bindLocalDatabaseService(LocalDatabase localDatabase){
        }

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

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