Dagger 2 注射无效
Dagger 2 injection not working
提供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;
}
}
允许将单例注入 activity 和片段
的组件
@Singleton
@Component(modules={MyModule.class})
public interface MyComponent {
void inject(Activity activity);
void inject(Fragment fragment);
void inject(Application application);
}
构建组件的主应用程序class
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;
}
}
这是我尝试注入 Retrofit 的片段。
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 中,改装实例都是空的。
您可以注入 Activity,片段和应用程序在同一个 Component.You 需要为每个 Activity,片段和组件创建单独的组件,像这样:
活动
在您的所有 activity:
中使用此组件
@Singleton
@Component(modules={MyModule.class})
public interface MyActivityComponent {
void inject(Activity activity);
void inject(AnotherActivity activity);
}
像这样在 activity 中注入:
component= DaggerMyActivityComponent.builder()
.myModule(new MyModule()).build();
getComponent().inject(this)
片段
在您的所有片段中使用此组件:
@Singleton
@Component(modules={MyModule.class})
public interface MyFragmentComponent {
void inject(Fragment fragment);
void inject(AnotherFragmen fragment);
}
像这样注入片段:
component= DaggerMyFragmentComponent.builder()
.myModule(new MyModule()).build();
getComponent().inject(this)
申请
在您的应用程序中使用此组件:
@Singleton
@Component(modules={MyModule.class})
public interface MyAppComponent {
void inject(Application application);
}
像这样在应用程序中注入:
component= DaggerMyAppComponent.builder()
.myModule(new MyModule()).build();
getComponent().inject(this)
提供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;
}
}
允许将单例注入 activity 和片段
的组件@Singleton
@Component(modules={MyModule.class})
public interface MyComponent {
void inject(Activity activity);
void inject(Fragment fragment);
void inject(Application application);
}
构建组件的主应用程序class
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;
}
}
这是我尝试注入 Retrofit 的片段。
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 中,改装实例都是空的。
您可以注入 Activity,片段和应用程序在同一个 Component.You 需要为每个 Activity,片段和组件创建单独的组件,像这样:
活动
在您的所有 activity:
中使用此组件@Singleton
@Component(modules={MyModule.class})
public interface MyActivityComponent {
void inject(Activity activity);
void inject(AnotherActivity activity);
}
像这样在 activity 中注入:
component= DaggerMyActivityComponent.builder()
.myModule(new MyModule()).build();
getComponent().inject(this)
片段
在您的所有片段中使用此组件:
@Singleton
@Component(modules={MyModule.class})
public interface MyFragmentComponent {
void inject(Fragment fragment);
void inject(AnotherFragmen fragment);
}
像这样注入片段:
component= DaggerMyFragmentComponent.builder()
.myModule(new MyModule()).build();
getComponent().inject(this)
申请
在您的应用程序中使用此组件:
@Singleton
@Component(modules={MyModule.class})
public interface MyAppComponent {
void inject(Application application);
}
像这样在应用程序中注入:
component= DaggerMyAppComponent.builder()
.myModule(new MyModule()).build();
getComponent().inject(this)