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