所以,简而言之,我对同一个应用程序有很多口味,但略有不同。我想为所有口味独立添加一个导航器。我使用的是 Dagger2,每种口味都有一个子组件,我只为给定的口味注入东西。所以我也想注入一个 Navigator 类。
诀窍是,公共代码中的某些类也使用此导航器,并进行空检查。因此,如果它为空,那很好,但如果不是,则执行 x。
所以我想要一个像这样的字段:
@Inject @Nullable Navigator navigator;
Run Code Online (Sandbox Code Playgroud)
如果没有类似这样的 @Provides 方法,Dagger 会给我一个错误,但这正是我想要的,我希望 @Provides 进入子模块,但仍然注入公共代码库。
我怎样才能实现这个目标?
我正在开发一个具有 dagger 依赖项的 Android 应用程序。当通过构造函数注入注入类时,它会抛出一个找不到符号的错误。如果我通过@Provides模块内部定义的方法提供依赖项,则一切正常。
编码:
public class SixthGenericTest {
@Inject
FirstTest firstTest;
@Inject
public SixthGenericTest()
{
Injection.create().getAppComponent().inject(this);
}
public String getData(){
return firstTest.getTestName();
}
}
@Singleton
@Component(modules = {FirstModule.class})
public interface AppComponent {
void inject(SixthGenericTest sixthGenericTest);
}
Run Code Online (Sandbox Code Playgroud)
和我得到的错误:
错误:(19, 28) 错误:找不到符号方法injectMembers(MembersInjector,SixthGenericTest)
我正在努力思考Dagger 2,但遇到了一种情况,我不太确定如何正确解决。我用来dagger.android设置subcomponents每个活动和片段,其中每个子组件都有一个具有自己的依赖项的演示者。
问题是一个片段应该显示从网络获取的信息,因此我将 a 传递URL给片段以告诉它要显示什么。但我不确定如何Dagger解决对片段加载的依赖。我以为我需要一个subcomponent builder,但这显然是多余的,因为编译器消息告诉我它需要来自URL一个Provides方法。我还为 设立了一个限定符,URL并用它注释了片段中的一个方法。我以为Dagger可以捡起来,但我错了。有人可以告诉我如何最好地处理这种情况吗?
我正在尝试将 Dagger 2.15 与我的 Kotlin 项目集成。即使我绑定了 ViewModel,我也遇到了以下编译时异常,
error: [dagger.android.AndroidInjector.inject(T)] java.util.Map<java.lang.Class<? extends android.arch.lifecycle.ViewModel>,? extends javax.inject.Provider<android.arch.lifecycle.ViewModel>> cannot be provided without an @Provides-annotated method.
我有 2 个具有相同作用域的依赖项,它们彼此需要。
我的依赖项是具有不同方法的域服务(每种方法都有不同的业务案例)。一些业务案例可能使用来自另一个领域的方法。
为了做到这一点,我需要 domain1 可用于 domain2,反之亦然。
但是当我这样做时,我得到一个依赖循环编译错误。在谷歌搜索一段时间后,我发现为了克服这个问题,我必须使用 @Inject 注释而不是 @Module 中的构造函数参数注入依赖项之一。
当我尝试这个代码编译但匕首根本没有注入第二个依赖项。
有没有办法用 Dagger 实现我想要的?
我有一个 Util 模块,如下所示,它需要活动上下文 [不是应用程序上下文] 来完成它的一些功能。
如何将活动上下文注入其中?
class MainPresenter internal constructor(private val iMainActivity: IActivity) : IPresenter {
//dependencies
private val context = iMainActivity as AppCompatActivity
private var util = UtilModule(context) //<-- inject this
private var httpClient = HttpClient(context) //<-- inject this
Run Code Online (Sandbox Code Playgroud) 我有一个AppModule包含三个函数的类:
@Singleton
@Provides
static FirebaseFirestore provideFirebaseFirestore() {
return FirebaseFirestore.getInstance();
}
@Singleton
@Provides
static CollectionReference provideUsersCollRef(FirebaseFirestore db) {
return db.collection("users");
}
@Singleton
@Provides
static CollectionReference provideBarsCollRef(FirebaseFirestore db) {
return db.collection("bars");
}
Run Code Online (Sandbox Code Playgroud)
我读过我可以使用某种命名,但我没有找到任何方法来解决这个问题。除此之外,我如何在片段代码中区分我注入的是哪一个引用?提前致谢。
编辑:
@Inject
@Named("bars")
BarsDataSource(CollectionReference barsRef) {
this.barsRef= barsRef;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 dagger 限定符在我的 android 应用程序中提供不同类型的 OkHttpClient.Builder 。例如,我有两个注释,即 @Authorized 和 @WithTime,每个注释都应该向客户端构建器添加一些拦截器。
我希望能够通过注释提供方法来获得不同的构建器(添加不同的拦截器)。但当我有多个注释时,我不知道如何去做。
这就是我之前在只需要一个注释(@Authorized)时所做的事情。但现在我可能需要更多类型的客户,这是不可能的。
@Provides
@Singleton
@Authorized
OkHttpClient.Builder provideOkHttpClientBuilderWithAuthorization(...)
Run Code Online (Sandbox Code Playgroud)
@Provides
@Singleton
OkHttpClient.Builder provideOkHttpClientBuilder(...)
Run Code Online (Sandbox Code Playgroud) 我使用刀柄。我有一个接口,但我有两个实现它们的类。我需要在 ViewModels 中实现不同的 @Bind 接口。请帮帮我?创建自定义组件?或使用自定义范围?
我正在尝试在 Android Canary 上使用 Compose 和 Hilt(最新版本),但我无法同步该项目。错误信息如下:
Unable to find method ''void com.android.build.api.extension.AndroidComponentsExtension$DefaultImpls.androidTests$default(com.android.build.api.extension.AndroidComponentsExtension, com.android.build.api.extension.VariantSelector, kotlin.jvm.functions.Function1, int, java.lang.Object)''
'void com.android.build.api.extension.AndroidComponentsExtension$DefaultImpls.androidTests$default(com.android.build.api.extension.AndroidComponentsExtension, com.android.build.api.extension.VariantSelector, kotlin.jvm.functions.Function1, int, java.lang.Object)'
Run Code Online (Sandbox Code Playgroud)
我的 build.gradle
ext {
compose_version = '1.0.0-beta01'
}
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.1.0-alpha01'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.30"
def hilt_version = "2.35"
classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version"
}
Run Code Online (Sandbox Code Playgroud)
我的 build.gradle(:app)
//Dagger - Hilt
def hilt_version = "2.35"
implementation "com.google.dagger:hilt-android:$hilt_version"
kapt "com.google.dagger:hilt-android-compiler:$hilt_version"
implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03"
kapt "androidx.hilt:hilt-compiler:1.0.0"
implementation 'androidx.hilt:hilt-navigation-compose:1.0.0-alpha02'
Run Code Online (Sandbox Code Playgroud)