gpt4 book ai didi

java - 如何避免为每个 View 添加注入(inject)方法?

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

目前要在 Activity 中获取例如 Picasso 的实例,我需要向 AppComponent 添加注入(inject)方法。如何避免添加注入(inject)方法,因为我有很多应该注入(inject)的 fragment 和 View :

AppComponent.class:

@ForApplication
@Singleton
@Component(
modules = {AppModule.class,OkHttpClientModule.class,NetworkApiModule.class,NetworkAuthModule.class})
public interface AppComponent {
void inject(Fragment1 obj);
void inject(Fragment2 obj);
void inject(Fragment3 obj);
void inject(Fragment4 obj);
void inject(Fragment5 obj);
void inject(Fragment6 obj);
...
}

Fragment1.class

public class Fragment1 extends Fragment {
@Inject Picasso mPicasso;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyApplication.getComponent(getContext()).inject(this);
}
}

我的类(class):

AppModule.class:

@Module
public class AppModule {
private MyApplication mApplication;

public AppModule(@NonNull MyApplication mApplication) {
this.mApplication = mApplication;
}

@Provides
@NonNull
@Singleton
public Application provideApplication() {
return mApplication;
}


@Provides
@ForApplication
Context provideContext(){
return mApplication;
}

@Provides
@Singleton
Picasso providesPicasso(@ForApplication Context context) {
return new Picasso.Builder(context).build();
}
}

ForApplication.class:

@Scope
@Retention(RUNTIME)
public @interface ForApplication {
}

我的应用程序类

public class MyApplicationextends Application {
static Context mContext;
private AppComponent component;
@Override
public void onCreate() {
super.onCreate();
mContext = this;

setupComponent();
}

private void setupComponent() {
component = DaggerAppComponent.builder().appModule(new AppModule(this)).build();
component.inject(this);
}

public AppComponent getComponent() {
if (component==null)
setupComponent();
return component;
}



public static AppComponent getComponent(Context context) {
return ((MyApplication) context.getApplicationContext()).getComponent();
}

更新

我还想为 fragment 注入(inject)适配器,如果我将注入(inject)添加到 BaseFragment,那么 BaseFragment 将拥有所有子 fragment 的所有适配器

最佳答案

一种解决方案是使用继承进行注入(inject)。

只需使用@Inject Picasso 实例定义一个BaseFragment,在您的DaggerComponent 中为此BaseFragment 创建一个注入(inject)方法,并在BaseFragment 的onCreate 方法中调用它。更具体的 Fragments 如 Fragment1, 2.. 可以继承自这个 BaseFragment 并使用 Picasso 实例。

关于java - 如何避免为每个 View 添加注入(inject)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39447436/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com