gpt4 book ai didi

android - Dagger 2 注入(inject)无效

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:51:51 26 4
gpt4 key购买 nike

提供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/

26 4 0
文章推荐: android - 嵌套的 recyclerview View ,如播放 Play 商店应用
文章推荐: javascript - Jquery 模拟点击
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com