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

Android 匕首注射可以用静态方法吗?,android,dagger-2,Android,Dagger 2,我有这个网络模块。我想在ErrorUtils的静态方法中注入网络模块 @Module public class NetworkModule { private final String END_POINT = "https://www.myurl.com/"; @Provides @Singleton public OkHttpClient getOkHttpClient() { OkHttpClient okHttpClient = b

我有这个网络模块。我想在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);
    }
我想在静态方法中注入这个模块,如下所示:

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;
    }
}
公共类ErrorUtils{
@注入
静态改装;
公共静态RestError parseError(响应){
**//写入此行时显示错误**
MyApplication.getComponent().inject(ErrorUtils.class);
Converter Converter=改装.responseBodyConverter(RestError.class,新注释[0]);
误差;
试一试{
error=converter.convert(response.errorBody());
}捕获(IOE异常){
返回新的RestError();
}
返回误差;
}
}
我们如何在静态方法中注入模块,有什么建议吗?

如中所示

匕首2不支持静态注射


静态方法和变量通常是个坏主意。在您的情况下,您可以将
ErrorUtils
作为一个对象,例如使用
@Singleton
范围。然后您可以正确地注入服务,也可以正确地注入
errorUtils
,而无需使用静态调用

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

@Component interface MyComponent {
    Retrofit getRetrofit();
}

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

“静态方法和变量通常是个坏主意”。。。关于public static Intent getCallingIntent()呢?我想访问那里的Gson对象,所以我必须在方法内部创建一个新实例,或者使用简单的singleton和静态方法getInstance()而不是Dagger…?@LeodroidCode因为静态对象(例如singleton)的问题称为全局状态。如果你能在任何地方读写东西,这可能会使测试变得几乎不可能,并可能导致更多的混乱。假设您希望在应用程序的两个不同位置对
日期
对象进行不同的反序列化,但共享同一个
Gson
实例。虽然Gson是一个无害的例子,几乎没有副作用。@DavidMedenjak当需要初始化时(即在应用程序生命周期中只发生一次),如
Crashlytics.init()
etc@Bhargav我将把它放到应用程序的
onCreate