如何在 Dagger 2 中使用多重依赖?

How to use multiple dependencies with Dagger 2?

我已经创建了 NetComponent 和 NetModule,我正在其中初始化网络通信所需的所有库。

这里是 NetComponent 代码:

@Singleton
@Component(modules={AppModule.class, NetModule.class})
public interface NetComponent {
   Retrofit retrofit();
}

我已经在应用程序 class 中初始化了那个 NetComponent。

public class App extends Application {

private NetComponent mNetComponent;

@Override
public void onCreate() {
    super.onCreate();

    mNetComponent = DaggerNetComponent.builder()
            .appModule(new AppModule(this))
            .netModule(new NetModule("mock.com"))
            .build();
}

public NetComponent getNetComponent() {
    return mNetComponent;
   }
}

现在我想在我的应用程序中使用 SharedPreferences,因此我创建了 SharedPreferencesModule 和组件 classes。

@Module
public class SharedPreferenceModule {

Application mApplication;

public SharedPreferenceModule(Application mApplication) {
    this.mApplication = mApplication;
}

@Provides
@Singleton
Application providesApplication() {
    return mApplication;
}

@Provides
@Singleton
SharedPreferences providesSharedPreferences(Application application) {
    return PreferenceManager.getDefaultSharedPreferences(application);
   }
}

这是来自 SharedPreferencesComponent 的代码:

@Singleton
@Component(modules = {SharedPreferenceModule.class})
public interface SharedPreferenceComponent {
    SharedPreferences getSharedPreference();
}

我想在我的 LoginAccountFragment class 中使用它。 LoginAccountFragment class 有自己的模块和组件。

@Module
public class LoginAccountModule {

private LoginAccountView view;

public LoginAccountModule(LoginAccountView view){
    this.view = view;
}

@Provides
@FragmentScoped
LoginAccountView providesLoginAccountView(){
    return view;
}

@Provides
@FragmentScoped
LoginAccountPresenter providesLoginAccountPresenter(LoginAccountPresenterImpl presenter){
    return presenter;
    }
}

@FragmentScoped
@Component(dependencies = {NetComponent.class}, modules =   LoginAccountModule.class)
public interface LoginAccountComponent {
    void inject(LoginAccountFragment fragment);
}

如何在 LoginAccountFragment 中注入 SharedPreferences?

@Singleton
@Component(modules={AppModule.class, NetModule.class, SharedPreferenceModule.class})
public interface ApplicationComponent {
   Retrofit retrofit();
   SharedPreferences sharedPreferences();
}


public class App extends Application {

    private ApplicationComponent applicationComponent;

    @Override
    public void onCreate() {
        super.onCreate();

        this.applicationComponent = DaggerNetComponent.builder()
                .appModule(new AppModule(this))
                .netModule(new NetModule("https://mock.com"))
                .build();
    }

    public ApplicationComponent applicationComponent() {
        return applicationComponent;
    }
}

@Module
public class SharedPreferenceModule {
    @Provides
    @Singleton
    SharedPreferences providesSharedPreferences(Application application) {
         return PreferenceManager.getDefaultSharedPreferences(application);
    } 
}


@Module
public class LoginAccountModule {

    private LoginAccountView view;

    public LoginAccountModule(LoginAccountView view){
        this.view = view;
    }

    @Provides
    LoginAccountView loginAccountView(){
        return view;
    }

    @Provides
    @FragmentScoped
    LoginAccountPresenter loginAccountPresenter(LoginAccountPresenterImpl presenter) {
        return presenter;
    }
}

@FragmentScoped
@Component(dependencies = {ApplicationComponent.class}, modules = LoginAccountModule.class)
public interface LoginAccountComponent extends ApplicationComponent {
    void inject(LoginAccountFragment fragment);
}