gpt4 book ai didi

java - Dagger 2 - 提供应用程序类

转载 作者:行者123 更新时间:2023-11-29 07:28:41 24 4
gpt4 key购买 nike

我正在尝试使用 Dagger 2 注入(inject)我的应用程序类 MyApplication,因为我在不同的地方使用它。这是我使用 Dagger 2.11

的设置

MyApplication.java

public class MyApplication extends Application  implements HasActivityInjector {

@Inject
DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;

@Override
public void onCreate() {
super.onCreate();
AppInjector.init(this);
}

@Override
public DispatchingAndroidInjector<Activity> activityInjector() {
return dispatchingAndroidInjector;
}
}

AppInjector.java

public class AppInjector {

public static void init(MyApplication application){

//Initialize dagger and inject the application
DaggerAppComponent.builder().application(application).build().inject(application);

application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle aBundle) {
handleActivity(activity);
}

@Override
public void onActivityStarted(Activity activity) {

}

@Override
public void onActivityResumed(Activity activity) {

}

@Override
public void onActivityPaused(Activity activity) {

}

@Override
public void onActivityStopped(Activity activity) {

}

@Override
public void onActivitySaveInstanceState(Activity activity, Bundle aBundle) {

}

@Override
public void onActivityDestroyed(Activity activity) {

}
});
}

private static void handleActivity(Activity activity){
if(activity instanceof HasSupportFragmentInjector ){
AndroidInjection.inject(activity);
}
if (activity instanceof FragmentActivity){
((FragmentActivity) activity).getSupportFragmentManager()
.registerFragmentLifecycleCallbacks(
new FragmentManager.FragmentLifecycleCallbacks() {
@Override
public void onFragmentCreated(FragmentManager fm, Fragment f,
Bundle savedInstanceState) {
if (f instanceof Injectable) {
Log.i("LifecycleCallbacks", "injected:" + f);

AndroidSupportInjection.inject(f);
}
}
}, true);
}
}

AppComponent.java

@Singleton
@Component(modules = {
AndroidInjectionModule.class,
ActivityBuilder.class,
AppModule.class
})

public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance Builder application(Application application);
AppComponent build();
}

void inject(MyApplication application);
}

但是,每次我尝试在构造函数中使用 @Inject MyApplication application 时,dagger 都会抛出一个错误,指出没有 @Provides 就无法提供它

此外,我不确定我是否应该在所有地方使用该应用程序,而只使用它的上下文?如果是这样,我将如何提供 Context

最佳答案

看看您的生成器...

@Component.Builder
interface Builder {
--> @BindsInstance Builder application(Application application);
AppComponent build();
}

Dagger 只知道你的 Application,你永远不会提到 MyApplication,因此注入(inject)它会失败。


我不知道为什么你必须专门注入(inject) MyApplication,但最简单的解决方案是将其更改为绑定(bind)你的 MyApplication ...

@Component.Builder
interface Builder {
@BindsInstance Builder application(/** --> */ MyApplication application);
AppComponent build();
}

然后 Dagger 知道 MyApplication 但不知道 Application。要解决此问题,您只需添加一个绑定(bind)其他类型的模块,这很容易,因为您具有子类型...例如

@Module interface AppModule { // could also be an abstract class
@Binds Application bindApplication(MyApplication application);

// if you also want to bind context
@Binds Context bindContext(MyApplication application);
}

只需将此模块添加到您的组件即可。

关于java - Dagger 2 - 提供应用程序类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46337226/

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