Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 匕首v2:在一个对象中注入2个不同的作用域_Android_Dagger 2 - Fatal编程技术网

Android 匕首v2:在一个对象中注入2个不同的作用域

Android 匕首v2:在一个对象中注入2个不同的作用域,android,dagger-2,Android,Dagger 2,我将moduleA设置为应用程序范围的单例提供程序,将ModuleB设置为用户相关的对象提供程序 我的用户显示片段将使用系统范围的总线向其他人发送消息,并使用与用户相关的对象进行显示 问题无法将不同的scrope类注入到一个对象中。使用component.getX方法可以很好地工作,但注入是首选方法。 错误消息: @UserScope不能引用具有不同作用域的绑定:@提供@Singleton Bus ModuleA.provideBus() 模块B作为用户相关信息提供者 @Module publi

我将moduleA设置为应用程序范围的单例提供程序,将ModuleB设置为用户相关的对象提供程序

我的用户显示片段将使用系统范围的总线向其他人发送消息,并使用与用户相关的对象进行显示

问题无法将不同的scrope类注入到一个对象中。使用component.getX方法可以很好地工作,但注入是首选方法。 错误消息: @UserScope不能引用具有不同作用域的绑定:@提供@Singleton Bus ModuleA.provideBus()

模块B作为用户相关信息提供者

@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”实现吗?