如何在模块中提供动态字符串,例如(服务器响应)?
how to provide dynamic String such as ( server response ) in module?
我最近在我的项目中使用了来自 New Android 带 Dagger 2 的注射器,但我遇到了一个问题:
我想提供一个带匕首的动态字符串,但我不知道该怎么做;
我从服务器收到一个令牌,需要将其作为字段传递给 OkHttp3CookieHelper 的实例;
我该怎么做?
我试图将此字符串传递给模块构造函数,但我认为这不是真的!
我想也许应该使用 @BindsInstance !!
请帮助 ;)
这是我的应用模块:
@Module(subcomponents = {MainActivityComponent.class})
public class AppModule {
private String cookie ;
public AppModule(String Cookie){
this.cookie = Cookie;
}
@Singleton
@Provides
Context provideContext(Application application) {
return application;
}
@Singleton
@Provides
OkHttp3CookieHelper provideCookie(@Named("baseURL") String baseURL,
@Named("csrfToken") String csrfToken) {
OkHttp3CookieHelper cookieHelper = new OkHttp3CookieHelper();
cookieHelper.setCookie(baseURL, csrfToken, cookie);
return cookieHelper;
}
@Singleton
@Provides
OkHttpClient.Builder provideOkHttp(HttpLoggingInterceptor interceptor,
OkHttp3CookieHelper cookieHelper) {
final OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.connectTimeout(8, TimeUnit.SECONDS);
httpClient.readTimeout(8, TimeUnit.SECONDS);
httpClient.callTimeout(8, TimeUnit.SECONDS);
httpClient.cookieJar(cookieHelper.cookieJar());
httpClient.addInterceptor(interceptor);
return httpClient;
}
@Singleton
@Provides
HttpLoggingInterceptor provideHttpInterceptor() {
final HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
return interceptor;
}
@Singleton
@Provides
GsonConverterFactory provideGsonConverterFactory() {
return GsonConverterFactory.create();
}
@Singleton
@Provides
@Named("baseURL")
String provideBaseURL() {
return Const.BASE_URL;
}
@Singleton
@Provides
@Named("csrfToken")
String provideCrfToken() {
return Const.CRF_TOKEN;
}
@Singleton
@Provides
Api provideApi(Retrofit retrofit) {
return retrofit.create(Api.class);
}
@Singleton
@Provides
Retrofit provideRetrofit(GsonConverterFactory converterFactory, OkHttpClient.Builder httpClient,
@Named("baseURL") String baseURL) {
return new Retrofit.Builder().baseUrl(baseURL)
.addConverterFactory(converterFactory)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(httpClient.build())
.build();
}
@Singleton
@Provides
SharedPreferences provideSharedPreference(Context context) {
return context.getSharedPreferences("myShp", Context.MODE_PRIVATE);
}
//and this is my AppComponent :
@Singleton
@Component(modules = {AndroidInjectionModule.class, ActivityBuilder.class, AppModule.class,
ViewModelFactoryModule.class})
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponent build();
}
void inject(App app);
}
问题:
dagger could not create instance from AppModule !
最后,经过大约 10 个小时的搜索和阅读,我解决了我的 issue:D
NOTICE !
不需要自己传递你的响应令牌也不需要将依赖项(在本例中是响应令牌)绑定到 AppComponent 但如果你想这样做你可以使用 @Component.Builder 或 @Component.Factory 你可以使用这篇有用的文章:
Dagger2: @Component.Factory and @SubComponent.Factory
但要解决问题:
首先应将此依赖项添加到 app.gradle 文件:
implementation 'com.github.franmontiel:PersistentCookieJar:v1.0.1'
然后在 appMoule class 中提供 PersistentCookieJar 的实例和
传递给我们的 OkHttpClient 实例:
@Singleton
@Provides
PersistentCookieJar ProvideCookieJar(Context context) {
return new PersistentCookieJar(new SetCookieCache(),
new SharedPrefsCookiePersistor(context));
}
@Singleton
@Provides
OkHttpClient.Builder provideOkHttp(HttpLoggingInterceptor interceptor,
PersistentCookieJar persistentCookieJar) {
final OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.connectTimeout(8, TimeUnit.SECONDS);
httpClient.readTimeout(8, TimeUnit.SECONDS);
httpClient.callTimeout(8, TimeUnit.SECONDS);
httpClient.cookieJar(persistentCookieJar);
httpClient.addInterceptor(interceptor);
return httpClient;
}
不要忘记提供需要创建 PersistentCookieJar 实例的 Context :
@Provides
@Singleton
Context provideContext(Application application) {
return application;
}
并且在您的应用程序中 class 应该绑定您的应用程序 class :
DaggerAppComponent.builder()
.application(this)
.build()
.inject(this);
你的 AppComponent 应该是这样的:
@Singleton
@Component(modules = {AndroidInjectionModule.class, ActivityBuilder.class,
AppModule.class, ViewModelFactoryModule.class})
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponent build();
}
void inject(App app);
}
好的,一切都完成了!
现在你的请求包含 cookie
并成功获得服务器响应:)
我最近在我的项目中使用了来自 New Android 带 Dagger 2 的注射器,但我遇到了一个问题: 我想提供一个带匕首的动态字符串,但我不知道该怎么做; 我从服务器收到一个令牌,需要将其作为字段传递给 OkHttp3CookieHelper 的实例; 我该怎么做?
我试图将此字符串传递给模块构造函数,但我认为这不是真的! 我想也许应该使用 @BindsInstance !! 请帮助 ;)
这是我的应用模块:
@Module(subcomponents = {MainActivityComponent.class})
public class AppModule {
private String cookie ;
public AppModule(String Cookie){
this.cookie = Cookie;
}
@Singleton
@Provides
Context provideContext(Application application) {
return application;
}
@Singleton
@Provides
OkHttp3CookieHelper provideCookie(@Named("baseURL") String baseURL,
@Named("csrfToken") String csrfToken) {
OkHttp3CookieHelper cookieHelper = new OkHttp3CookieHelper();
cookieHelper.setCookie(baseURL, csrfToken, cookie);
return cookieHelper;
}
@Singleton
@Provides
OkHttpClient.Builder provideOkHttp(HttpLoggingInterceptor interceptor,
OkHttp3CookieHelper cookieHelper) {
final OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.connectTimeout(8, TimeUnit.SECONDS);
httpClient.readTimeout(8, TimeUnit.SECONDS);
httpClient.callTimeout(8, TimeUnit.SECONDS);
httpClient.cookieJar(cookieHelper.cookieJar());
httpClient.addInterceptor(interceptor);
return httpClient;
}
@Singleton
@Provides
HttpLoggingInterceptor provideHttpInterceptor() {
final HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
return interceptor;
}
@Singleton
@Provides
GsonConverterFactory provideGsonConverterFactory() {
return GsonConverterFactory.create();
}
@Singleton
@Provides
@Named("baseURL")
String provideBaseURL() {
return Const.BASE_URL;
}
@Singleton
@Provides
@Named("csrfToken")
String provideCrfToken() {
return Const.CRF_TOKEN;
}
@Singleton
@Provides
Api provideApi(Retrofit retrofit) {
return retrofit.create(Api.class);
}
@Singleton
@Provides
Retrofit provideRetrofit(GsonConverterFactory converterFactory, OkHttpClient.Builder httpClient,
@Named("baseURL") String baseURL) {
return new Retrofit.Builder().baseUrl(baseURL)
.addConverterFactory(converterFactory)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(httpClient.build())
.build();
}
@Singleton
@Provides
SharedPreferences provideSharedPreference(Context context) {
return context.getSharedPreferences("myShp", Context.MODE_PRIVATE);
}
//and this is my AppComponent :
@Singleton
@Component(modules = {AndroidInjectionModule.class, ActivityBuilder.class, AppModule.class,
ViewModelFactoryModule.class})
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponent build();
}
void inject(App app);
}
问题: dagger could not create instance from AppModule !
最后,经过大约 10 个小时的搜索和阅读,我解决了我的 issue:D
NOTICE !
不需要自己传递你的响应令牌也不需要将依赖项(在本例中是响应令牌)绑定到 AppComponent 但如果你想这样做你可以使用 @Component.Builder 或 @Component.Factory 你可以使用这篇有用的文章: Dagger2: @Component.Factory and @SubComponent.Factory
但要解决问题:
首先应将此依赖项添加到 app.gradle 文件:
implementation 'com.github.franmontiel:PersistentCookieJar:v1.0.1'
然后在 appMoule class 中提供 PersistentCookieJar 的实例和 传递给我们的 OkHttpClient 实例:
@Singleton
@Provides
PersistentCookieJar ProvideCookieJar(Context context) {
return new PersistentCookieJar(new SetCookieCache(),
new SharedPrefsCookiePersistor(context));
}
@Singleton
@Provides
OkHttpClient.Builder provideOkHttp(HttpLoggingInterceptor interceptor,
PersistentCookieJar persistentCookieJar) {
final OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.connectTimeout(8, TimeUnit.SECONDS);
httpClient.readTimeout(8, TimeUnit.SECONDS);
httpClient.callTimeout(8, TimeUnit.SECONDS);
httpClient.cookieJar(persistentCookieJar);
httpClient.addInterceptor(interceptor);
return httpClient;
}
不要忘记提供需要创建 PersistentCookieJar 实例的 Context :
@Provides
@Singleton
Context provideContext(Application application) {
return application;
}
并且在您的应用程序中 class 应该绑定您的应用程序 class :
DaggerAppComponent.builder()
.application(this)
.build()
.inject(this);
你的 AppComponent 应该是这样的:
@Singleton
@Component(modules = {AndroidInjectionModule.class, ActivityBuilder.class,
AppModule.class, ViewModelFactoryModule.class})
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponent build();
}
void inject(App app);
}
好的,一切都完成了! 现在你的请求包含 cookie 并成功获得服务器响应:)