可以用静态方法完成匕首注射吗?

Raj*_*dka 15 android dagger-2

我有这个网络模块.我想在ErrorUtils的静态方法中注入网络模块.

@Module
public class NetworkModule {
    private final String END_POINT = "https://www.myurl.com/";

    @Provides
    @Singleton
    public OkHttpClient getOkHttpClient() {
            OkHttpClient okHttpClient = builder.build();
            return okHttpClient;
       }

    @Provides
    @Singleton
    public GsonConverterFactory getGsonConverterFactory() {
        return GsonConverterFactory.create();
    }

    @Provides
    @Singleton
    public Retrofit getRetrofit(OkHttpClient okHttpClient, GsonConverterFactory gsonConverterFactory) {
        return new Retrofit.Builder()
                .baseUrl(END_POINT)
                .client(okHttpClient)
                .addConverterFactory(gsonConverterFactory)
                .build();
    }

    @Provides
    @Singleton
    public RetrofitService getRetrofitService(Retrofit retrofit) {
        return retrofit.create(RetrofitService.class);
    }
Run Code Online (Sandbox Code Playgroud)

我想在静态方法中注入此模块:

public class ErrorUtils {
    @Inject
    static Retrofit retrofit;

    public static RestError parseError(Response<?> response) {

        **//showing error while writing this line**

        MyApplication.getComponent().inject(ErrorUtils.class);
        Converter<ResponseBody, RestError> converter = retrofit.responseBodyConverter(RestError.class, new Annotation[0]);

        RestError error;

        try {
            error = converter.convert(response.errorBody());
        } catch (IOException e) {
            return new RestError();
        }

        return error;
    }
}
Run Code Online (Sandbox Code Playgroud)

我们如何在静态方法中注入模块,有什么建议吗?

Dav*_*jak 23

从匕首迁移1中可以看出

Dagger 2 支持静电注射.

静态方法和变量通常是个坏主意.在您的情况下,您可以创建ErrorUtils一个对象,例如使用@Singleton范围.然后你可以正确地注入服务,并在errorUtils不使用静态调用的情况下正确地注入你的服务.

如果这不是一个选项,您可以只为组件提供一个getter

@Component interface MyComponent {
    Retrofit getRetrofit();
}
Run Code Online (Sandbox Code Playgroud)

然后使用该方法设置静态变量.