首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在模块中提供动态字符串(如服务器响应)?

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

Stack Overflow用户
提问于 2020-03-01 18:09:01
回答 1查看 120关注 0票数 0

我最近在我的项目中使用了带有Dagger 2的 need,我有一个问题:我想用匕首提供一个动态字符串,而我不知道如何做到这一点;我从服务器接收到一个令牌,并需要将它作为字段传递给和的实例--我应该怎么做呢?

我试图将这个字符串传递给,但是我认为这不是真的!我想也许应该用@BindsInstance !!(请帮助;)

这是我的AppModule:

代码语言:javascript
复制
@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无法从AppModule创建实例!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-02 23:12:22

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

注意!

不需要自己传递响应令牌,也不需要将依赖项(在本例中是响应令牌)绑定到AppComponent中,但如果要这样做,可以使用@Component.Builder或@Component.Factory,可以使用以下有用的文章:Dagger2:@Component.Factory和@SubComponent.Factory

但要解决问题:

首先,应该将此依赖项添加到app.gradle文件中:

代码语言:javascript
复制
implementation 'com.github.franmontiel:PersistentCookieJar:v1.0.1'

然后在PersistentCookieJar类中提供appMoule实例,并传递给我们的OkHttpClient实例:

代码语言:javascript
复制
@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实例的上下文:

代码语言:javascript
复制
@Provides
@Singleton
Context provideContext(Application application) {
    return application;
}

在应用程序类中,应该绑定应用程序类:

代码语言:javascript
复制
DaggerAppComponent.builder()
                      .application(this)
                      .build()
                      .inject(this);

你的AppComponent应该是这样的:

代码语言:javascript
复制
@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,并且可以成功地获得服务器响应:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60478205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档