2017-01-09 88 views
3

我试图在Dagger2中进行SubScoping。但是,我无法弄清这个编译错误: - >...MyApplicationModule must be set发生在我的LogInFragment中。如果有人会试图对这个错误投下一些信息。我真的很高兴。Dagger2错误:模块必须设置

这是MyApplication的类

public class MyApplication extends Application { 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     MyInjector.initialize(this); 
    } 
} 

这是MyInjector类别:

public enum MyInjector { 
    INSTANCE; 

    MyApplicationComponent myApplicationComponent; 


    private MyInjector() { 
    } 

    public static void initialize(MyApplication myApplication) { 

     MyApplicationComponent myApplicationComponent = DaggerMyApplicationComponent.builder() 
       .myApplicationModule(new MyApplicationModule(myApplication)) 
       .build(); 
     INSTANCE.myApplicationComponent = myApplicationComponent; 
    } 

    public static MyApplicationComponent get() { 
     return INSTANCE.myApplicationComponent; 
    } 

} 

这是MyApplicationComponent类别:

@Component (modules = {MyApplicationModule.class}) 
public interface MyApplicationComponent { 

} 

这是MyApplicationModule类

@Module 
public class MyApplicationModule { 

    private final MyApplication myApplication; 

    public MyApplicationModule(MyApplication myApplication) { 
     this.myApplication = myApplication; 
    } 

    @Singleton 
    @Provides 
    SharedPreferences providesSharedPreferences(Context context) { 
     return context.getSharedPreferences("My_Pref", Context.MODE_PRIVATE); 
    } 

    @Singleton 
    @Provides 
    public Context providesMyApplicationContext() { 
     return this.myApplication.getApplicationContext(); 
    } 

    @Singleton 
    @Provides 
    public LocationManager providesLocationService(Context context) { 
     return (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 
    } 

    @Singleton 
    @Provides 
    public MyDatabaseManager providesMyDatabaseManager(Context context) { 
     return MyDatabaseManager.getInstance(context); 
    } 

    @Singleton 
    @Provides 
    public AccountSystemModel providesAccountSystemModel(Context context) { 
     return MyDatabaseManager.getInstance(context); 
    } 

    @Singleton 
    @Provides 
    public MyApplication providesMyApplication(){ 
     return this.myApplication; 
    } 

} 

这是我试图子范围

这是MyLogIn组件类

@Singleton 
@Component(modules = {MyApplicationModule.class}, dependencies = {MyApplicationComponent.class}) 
public interface LogInComponent { 
    LogInPresenter signInPresenter(); 
} 

这就是Compilation Error发生

这是MyLogInActivityFragment

@Override protected void injectDependencies() { 
    logInComponent = DaggerLogInComponent.builder() 
        .myApplicationComponent(MyInjector.get()) 
        .build(); 
} 

回答

4

LogInComponent取决于MyApplicationComponent包含MyApplicationModule。你也不应该在LogInComponent中声明这个相同的模块。删除它,它会编译。


此外,还要确保你揭露你在LogInComponentMyApplicationComponent需要依赖它们添加到组件接口,像这样:

@Component (modules = {MyApplicationModule.class}) 
public interface MyApplicationComponent { 
    Context context(); 
    SharedPreferences sharedPreferences(); 
    // ... 
} 

另一个技巧 - 如果你需要所有的依赖MyApplicationComponent您可能想要阅读关于subcomponents

16

在我的情况下,错误是由abstract class模块造成的。如果模块是抽象的,模块不能被Dagger使用。

相关问题