我是初次使用Proguard和Dagger的Android应用程序,所以如果有人能给我一些指示,我真的很感激.
Proguard和Dagger已在应用程序中实现.当通过调试模式安装应用程序(即从Eclipse推送)时,运行应用程序没有问题.但是,当我运行应用程序的发布版本时,它崩溃了以下跟踪:
No injectable members on com.example.test.d. Do you want to add an injectable constructor? required by com.example.test.d com.example.test.SampleActivity.a
No injectable members on com.b.a.b. Do you want to add an injectable constructor? required by com.b.a.b com.example.test.SampleActivity.b
at dagger.internal.h.a(ThrowingErrorHandler.java:34)
at dagger.internal.Linker.a(Linker.java:136)
at dagger.d.a(ObjectGraph.java:264)
at dagger.d.a(ObjectGraph.java:238)
at com.example.test.SampleApplication.a(SampleApplication.java:24)
Run Code Online (Sandbox Code Playgroud)
我已按照以下建议进行操作:https://plus.google.com/108620120050432268974/posts/AAjvwg3Hmgg,将以下内容实施到proguard-project.txt中:
-keep class * extends dagger.internal.Binding
-keep class * extends dagger.internal.ModuleAdapter
-keep class * extends dagger.internal.StaticInjection
Run Code Online (Sandbox Code Playgroud)
但它似乎没有解决问题.建议?提前致谢.
Dagger文档显示使用a Provider<Filter>来获取Filter实例,这看起来非常有意义.
我正在写一个ListAdapter实例化视图,我希望Dagger注入.我很想注入Provider<ViewType>到我ListAdapter,并调用mViewProvider.get()实例的意见.
但是,Dagger文档说:
注入
Provider<T>可能会产生令人困惑的代码,并且可能是图形中错误范围或错误结构对象的设计气味.通常你想使用一个Factory<T>或一个Lazy<T>或者重新组织的寿命和你的代码的结构,能够只注入T
我可以看到我怎么可以使用辅助注射时使用一个工厂,以类似的方式,需要.
但是,考虑到我自己必须自己写这个,Factory<T>有什么优势可以使用我自己的使用Dagger Provider<T>?
我正在尝试第一次匕首,在配置模块后,我得到一个我不明白的错误.
我的代码是:
public class Parrot {
private Language language;
@Inject
public Parrot(Language language) {
this.language = language;
}
public void sayHello() {
System.out.println(language.getSalute());
}
}
public interface Language {
public String getSalute();
}
public class EnglishLanguage implements Language {
@Override
public String getSalute() {
return "Hello!";
}
}
Run Code Online (Sandbox Code Playgroud)
我的模块是
@Module(
injects = Language.class
)
public class PetShopModule {
@Provides Parrot provideParrot(Parrot parrot){
return parrot;
}
}
Run Code Online (Sandbox Code Playgroud)
在代码中我用这种方式
EnglishLanguage lang=SystemApp.getSystemLanguage();
ObjectGraph objectGraph = ObjectGraph.create(new PetShopModule());
objectGraph.inject(myLanguage);
Parrot parrot = objectGraph.get(Parrot.class);
Run Code Online (Sandbox Code Playgroud)
编译器抱怨: …
在我的Android应用程序中,我使用Otto作为事件总线,使用Dagger进行依赖注入.
在Otto的用户指南和许多博客文章中,建议使用注入来获取总线单例.我已经做了一段时间,但最近我更加怀疑如果注入总线比使用简单的静态单例有任何优势.
使用注入时,我必须注入我希望能够在总线上发布UI事件的每个自定义View或ViewHolder.尤其是匕首,在我需要公共汽车的地方注入每个班级似乎有点笨拙.当然,我可以通过构造函数或setter方法传递总线,但是如果您考虑具有许多不同视图类型的适配器,那也可能有点笨拙.
我注意到注入总线没有任何好处.在Otto的情况下,注入了一个具体的实现(Bus的一个实例),并且永远不会改变.由于订阅的工作方式,包装Otto进行解耦对于思考是没有任何意义的.
那么,有没有人看到注入奥托的任何优点,我没有看到?
问题
我需要从USER输入的域调用API,我需要Retrofit在调用之前根据插入的数据编辑我的单例.
有没有办法"重置"我的单身人士,迫使它重新创建?
要么
有没有办法baseUrl在调用之前用我的数据(可能在Interceptor?)更新我的?
码
单身
@Provides
@Singleton
Retrofit provideRetrofit(SharedPreferences prefs) {
String apiUrl = "https://%1s%2s";
apiUrl = String.format(apiUrl, prefs.getString(ACCOUNT_SUBDOMAIN, null), prefs.getString(ACCOUNT_DOMAIN, null));
OkHttpClient httpClient = new OkHttpClient.Builder()
.addInterceptor(new HeaderInterceptor())
.build();
return new Retrofit.Builder()
.baseUrl(apiUrl)
.addConverterFactory(GsonConverterFactory.create())
.client(httpClient)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
}
@Provides
@Singleton
API provideAPI(Retrofit retrofit) {
return retrofit.create(API.class);
}
Run Code Online (Sandbox Code Playgroud)
API
@FormUrlEncoded
@POST("endpoint")
Observable<Response> logIn(@Field("login") String login, @Field("password") String password);
Run Code Online (Sandbox Code Playgroud)
它现在如何运作
好的想法是SharedPrefs在API调用之前保存用户域数据并baseUrl使用格式化的String进行修改.
我对使用dagger-android的Dagger中的范围依赖感到困惑.
使用@ContributesAndroidInjetor我有一个类似如下的代码:
@Module
public abstract class ActivityBindingModule {
@ContributesAndroidInjector(modules = PotatoesModule.class)
public abstract MainActivity contributeMainActivityInjector();
@ContributesAndroidInjector
public abstract UserActivity contributeUserActivity();
}
Run Code Online (Sandbox Code Playgroud)
ActivityBindingModule在我的AppComponent中定义为一个模块.但问题是.我该怎么办呢
@UserScope
@Component(dependencies = AppComponent.class)
public interface UserComponent {...}
Run Code Online (Sandbox Code Playgroud)
并注释一个Activity来使用该范围?我的所有依赖都是活动"本地单身人士"吗?因为每个Activity注入器都是AppComponent的子组件.
也许我不理解使用dagger-android的"范围"的概念,如果有人能够解释它,我会很高兴.
请帮助我将 Dagger 2 连接到 Kotlin。\n我的应用程序构建 gradle:
\n\napply plugin: \'com.android.application\'\napply plugin: \'kotlin-android\'\napply plugin: \'kotlin-android-extensions\'\napply plugin: \'io.fabric\'\napply plugin: \'kotlin-kapt\'\n\nandroid {\n compileSdkVersion 28\n defaultConfig {\n applicationId "mobile.socialboards.com"\n minSdkVersion 21\n targetSdkVersion 28\n versionCode 19\n versionName \'1.0\'\n testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"\n }\n buildTypes {\n release {\n minifyEnabled false\n proguardFiles getDefaultProguardFile(\'proguard-android.txt\'), \'proguard-rules.pro\'\n }\n debug {\n minifyEnabled false\n }\n }\n configurations {\n cleanedAnnotations\n compile.exclude group: \'org.jetbrains\' , module:\'annotations\'\n }\n productFlavors {}\n compileOptions {\n sourceCompatibility JavaVersion.VERSION_1_8\n targetCompatibility JavaVersion.VERSION_1_8\n }\n kotlinOptions {\n jvmTarget = \'1.8\'\n freeCompilerArgs = [\'-Xjvm-default=enable\']\n }\n lintOptions …Run Code Online (Sandbox Code Playgroud) 我想使用拦截器刷新我的令牌,但我的拦截器需要 API 服务来进行 API 调用。我陷入了依赖循环。
这是我的 ApplicationModule 类:
@Module
@InstallIn(ApplicationComponent::class)
class ApplicationModule {
@Provides
fun providerBaseUrl() = AppConstants.BASE_URL
@Provides
@Singleton
fun provideOkHttpClient(authInterceptor: AuthInterceptor,
networkInterceptor: NetworkInterceptor) = if (BuildConfig.DEBUG) {
val loggingInterceptor = HttpLoggingInterceptor()
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY)
OkHttpClient.Builder()
.addInterceptor(authInterceptor)
.addInterceptor(loggingInterceptor)
.addInterceptor(networkInterceptor)
// .addInterceptor(refreshTokenInterceptor) // I want to put my interceptor here
.connectTimeout(2, TimeUnit.MINUTES)
.readTimeout(2, TimeUnit.MINUTES)
.writeTimeout(2, TimeUnit.MINUTES)
.build()
} else OkHttpClient
.Builder()
.connectTimeout(2, TimeUnit.MINUTES)
.readTimeout(2, TimeUnit.MINUTES)
.writeTimeout(2, TimeUnit.MINUTES)
.addInterceptor(authInterceptor)
.addInterceptor(networkInterceptor)
.build()
@Provides
@Singleton
fun provideRetrofit(
okHttpClient: OkHttpClient,
BASE_URL: String
): Retrofit =
Retrofit.Builder() …Run Code Online (Sandbox Code Playgroud) 我的问题非常简单明了:两个注释/示例有什么区别:
@Singleton
class MySingletonClass() {}
@Module
@InstallIn(FragmentComponent::class)
abstract class MyFragmentModule {
@Provides
fun provideMySingletonClass() = MySingletonClass()
}
Run Code Online (Sandbox Code Playgroud)
class MySingletonClass() {}
@Module
@InstallIn(FragmentComponent::class)
abstract class MyFragmentModule {
@Singleton
@Provides
fun provideMySingletonClass() = MySingletonClass()
}
Run Code Online (Sandbox Code Playgroud)
我知道的唯一区别是,第二个示例给出了以下错误:
error: [Dagger/IncompatiblyScopedBindings] FragmentC scoped with @dagger.hilt.android.scopes.FragmentScoped may not reference bindings with different scopes:
Run Code Online (Sandbox Code Playgroud)
这是否意味着@Singleton示例一中的注释被简单地忽略了?
上次我尝试从 kapt 迁移到 ksp,所有库都没有问题,而不是 dagger... 参见库
dagger2_版本'2.47'
我收到错误日志:e: [ksp] 使用 KSP 编译时无法使用旧版 dagger.spi.BindingGraphPlugin:Dagger/Android/DuplicateAndroidInjectors。使用 KAPT 进行编译或迁移插件以实现 dagger.spi.model.BindingGraphPlugin。e: KSP 发生错误,查看日志了解详细信息
有人有类似的问题吗?我找不到任何东西