android - Dagger 2 注入(inject)无效

标签 android retrofit2 dagger-2

提供Gson、Retrofit、OkHttpClient单例的模块

@Module
public class MyModule {

    @Provides
    @Singleton
    Gson provideGson() {
        GsonBuilder gsonBuilder = new GsonBuilder();
        return gsonBuilder.create();
    }

    @Provides
    @Singleton
    OkHttpClient provideOkHttpClient() {
        OkHttpClient client = new OkHttpClient();
        return client;
    }

    @Provides
    @Singleton
    Retrofit provideRetrofit(Gson gson, OkHttpClient okHttpClient) {
        Retrofit retrofit = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create(gson))
                .baseUrl(BuildConfig.SERVER_BASE_URL)
                .client(okHttpClient)
                .build();
        return retrofit;
    }
}

允许将单例注入(inject) Activity 和 fragment 的组件

@Singleton
@Component(modules={MyModule.class})
public interface MyComponent {

    void inject(Activity activity);
    void inject(Fragment fragment);
    void inject(Application application);
}

构建组件的主要应用类

public class MyApp extends Application{


    private MyComponent component;

    @Inject
    Retrofit retrofit;

    @Override
    public void onCreate() {
        super.onCreate();
        component= DaggerMyComponent.builder()
                .myModule(new MyModule()).build();
        getComponent().inject(this); // inject retrofit here
    }

    public MyComponent getComponent() {
        return component;
    }
}

这是我尝试注入(inject) Retrofit 的 fragment 。

public class MyFragment extends Fragment {

    @Inject
    Retrofit retrofit;

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {
        ((MyApp)getActivity().getApplication()).getComponent().inject(this);
      ....

    }
}

在 MyApp 和 MyFragment 中,改造实例都是空的。

最佳答案

您可以在同一组件中注入(inject) Activity、Fragment 和 Application。您需要为每个 Activity、Fragment 和组件创建单独的组件,如下所示:

Activity

在您的所有 Activity 中使用此组件:

@Singleton
@Component(modules={MyModule.class})
public interface MyActivityComponent {
    void inject(Activity activity);
    void inject(AnotherActivity activity);
}

像这样注入(inject) Activity :

component= DaggerMyActivityComponent.builder()
                .myModule(new MyModule()).build();
        getComponent().inject(this)

fragment

在你所有的 fragment 中使用这个组件:

    @Singleton
    @Component(modules={MyModule.class})
    public interface MyFragmentComponent {

        void inject(Fragment fragment);
        void inject(AnotherFragmen fragment);
    }

像这样注入(inject) fragment :

component= DaggerMyFragmentComponent.builder()
                .myModule(new MyModule()).build();
        getComponent().inject(this)

申请

在您的应用程序中使用此组件:

    @Singleton
    @Component(modules={MyModule.class})
    public interface MyAppComponent {
        void inject(Application application);
    }

像这样注入(inject)应用程序:

component= DaggerMyAppComponent.builder()
                .myModule(new MyModule()).build();
        getComponent().inject(this)

关于android - Dagger 2 注入(inject)无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42687686/

相关文章:

java - 有没有办法将接口(interface)的实现委托(delegate)给不同的类?

android - 如何使用改造从缓存图像发出 MultipartBbody.Part 请求

android - 改造。 java.net.协议(protocol)异常 : expected * bytes but received *

java - Dagger 2 : When to use constructor injections and when to use field injections?

Java Android - Redmi 3 (MIUI) - 无法更改通知图标?

android - 自定义 xml 文件中的操作栏大小

java - 强制改造以加载新数据

android - 刀柄 : lateinit property repository has not been initialized in ViewModel

android - Dagger 2 - 将 FragmentManager 传递给构造函数

java - 通过 HttpClient 接受所有 Cookie