Android 匕首v2:在一个对象中注入2个不同的作用域
我将moduleA设置为应用程序范围的单例提供程序,将ModuleB设置为用户相关的对象提供程序 我的用户显示片段将使用系统范围的总线向其他人发送消息,并使用与用户相关的对象进行显示 问题无法将不同的scrope类注入到一个对象中。使用component.getX方法可以很好地工作,但注入是首选方法。 错误消息: @UserScope不能引用具有不同作用域的绑定:@提供@Singleton Bus ModuleA.provideBus() 模块B作为用户相关信息提供者Android 匕首v2:在一个对象中注入2个不同的作用域,android,dagger-2,Android,Dagger 2,我将moduleA设置为应用程序范围的单例提供程序,将ModuleB设置为用户相关的对象提供程序 我的用户显示片段将使用系统范围的总线向其他人发送消息,并使用与用户相关的对象进行显示 问题无法将不同的scrope类注入到一个对象中。使用component.getX方法可以很好地工作,但注入是首选方法。 错误消息: @UserScope不能引用具有不同作用域的绑定:@提供@Singleton Bus ModuleA.provideBus() 模块B作为用户相关信息提供者 @Module publi
@Module
public class ModuleB{
private final User user;
public ModuleB(User user) {...}
@Provides @UserScope User provideUser() {}
@Provides @UserScope UserManager provideUserManager() {}
}
组件设置如下所示:
@Component (modules={ModuleA.class})
@Singleton
public interface ComponentA {
Bus getBus();
void inject(ClassA target);
}
@Component(modules={ModuleB.class})
@UserScope
public interface ComponentB {
User getUser();
UserManager getUserManager();
void inject(ClassA target);
}
class UserFragment exrtends Fragment {
@Inject Bus bus;
@Inject UserManager userManager;
public void onCreate() {
getComponentA().inject(this);
getComponentB().inject(this);
}
}
试试这个配置,它适合我。关于Dagger2确实缺乏好的文档,所以我研究了一些开源代码示例,您可以在GitHub中通过关键字(如Dagger2)找到这些示例 应用程序级组件
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
// exported for child-components
Bus eventBus();
}
@ActivityScope
@Component(dependencies=AppComponent.class, modules=MainActivityModule.class)
public interface MainActivityComponent {
void inject( MainActivity mainActivity );
}
应用级模块
@Module
public class AppModule {
@Provides @Singleton
Bus provideBus() {
return BusProvider.getInstance();
}
}
@Module
public class MainActivityModule {
private final MainActivity mActivity;
public MainActivityModule( MainActivity activity ) {
mActivity = activity;
}
@Provides
MainActivityTitleController provideTitleController() {
return new MainActivityTitleController( mActivity );
}
}
活动级别组件
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
// exported for child-components
Bus eventBus();
}
@ActivityScope
@Component(dependencies=AppComponent.class, modules=MainActivityModule.class)
public interface MainActivityComponent {
void inject( MainActivity mainActivity );
}
活动级模块
@Module
public class AppModule {
@Provides @Singleton
Bus provideBus() {
return BusProvider.getInstance();
}
}
@Module
public class MainActivityModule {
private final MainActivity mActivity;
public MainActivityModule( MainActivity activity ) {
mActivity = activity;
}
@Provides
MainActivityTitleController provideTitleController() {
return new MainActivityTitleController( mActivity );
}
}
Android应用程序类
public class MyApplication extends Application {
private AppComponent mAppComponent;
@Override
public void onCreate() {
super.onCreate();
// Dagger2
mAppComponent = Dagger_AppComponent.builder()
.appModule( new AppModule( this ))
.build();
}
public AppComponent getComponent() {
return mAppComponent;
}
public static AppComponent getComponent( Context context ) {
return ((MyApplication)context.getApplicationContext()).getComponent();
}
}
最后是活动
public class MainActivity extends ActionBarActivity {
// Injectable fields
@Inject Bus mEventBus;
@Inject MainActivityTitleController mTitleController;
private MainActivityComponent mComponent;
@Override
protected void onCreate( Bundle savedInstanceState ) {
// Dagger2
mComponent = Dagger_MainActivityComponent.builder()
.appComponent( ((MyApplication)getApplication()).getComponent() )
.mainActivityModule( new MainActivityModule( this ) )
.build();
mComponent.inject( this );
}
}
我认为您提供的代码片段中的主要问题是,您的
ModuleB
应该依赖于ModuleA
,以便正确地向singleton提供您得到的错误。也就是说,这应该是可行的:
@Component(modules={ModuleB.class}, dependencies = ComponentA.class)
@UserScope
public interface ComponentB {
User getUser();
UserManager getUserManager();
void inject(MainActivity target);
}
我重新创建了你的类,并做了一些假设来填补空白,看起来效果不错。您可以看到完整的工作代码。我的代码中唯一的区别是,你称之为
ClassA
/UserFragment
我刚才称之为MainActivity
,但在其他方面结构是相同的。如果MainActivityComponent
是一个子组件,你能发布“getInstance”实现吗?