Java 如何在模块中提供动态字符串,例如(服务器响应)?

Java 如何在模块中提供动态字符串,例如(服务器响应)?,java,android,dagger-2,androidinjector,Java,Android,Dagger 2,Androidinjector,我最近在我的项目中使用了新的Android Injector with Dagger 2,我有一个问题: 我想提供一个动态字符串与匕首,我不知道如何做到这一点; 我从服务器收到一个令牌,需要将此作为字段传递给OkHttp3CookieHelper的实例; 我该怎么做 我试图将这个字符串传递给模块构造函数,但我认为这不是真的! 我想也许应该使用@BindsInstance!! 请帮忙;) 这是我的AppModule: @Module(subcomponents = {MainActivityCom

我最近在我的项目中使用了新的Android Injector with Dagger 2,我有一个问题: 我想提供一个动态字符串与匕首,我不知道如何做到这一点; 我从服务器收到一个令牌,需要将此作为字段传递给OkHttp3CookieHelper的实例; 我该怎么做

我试图将这个字符串传递给模块构造函数,但我认为这不是真的! 我想也许应该使用@BindsInstance!! 请帮忙;)

这是我的AppModule:

@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);
}
问题:

最后,经过大约10个小时的搜索和阅读,我解决了我的问题:D

注意

无需自行传递响应令牌,也无需将依赖项(在本例中为响应令牌)绑定到AppComponent中,但如果您想这样做,可以使用@Component.Builder或@Component.Factory,您可以使用以下有用的文章:

但要解决这个问题: 首先应将此依赖项添加到app.gradle文件:

implementation 'com.github.franmontiel:PersistentCookieJar:v1.0.1'
然后在appMoule类中提供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实例所需的上下文:

@Provides
@Singleton
Context provideContext(Application application) {
    return application;
}
在应用程序类中,应绑定应用程序类:

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
并且成功地获得服务器响应:)

辅助注入应该可以实现无人能帮助的效果吗(