Dagger2如何执行具有默认构造函数依赖项的构造函数注入

时间:2019-06-25 07:02:29

标签: android dagger-2

我想问一下如何注入没有任何参数的构造函数。我遇到了这个问题,但找不到解决方案。 这是我的回购课程

public class UrlsRepository {

    private UrlsSource urlsSource;

    @Inject
    public UrlsRepository(UrlsSource urlsSource){
        this.urlsSource = urlsSource;
    }

    public String getLandingUrl(){
        return urlsSource.getLoginUrl();
    }

    public String[] getDashboardUrls(){
        return urlsSource.getDashboardUrls();
    }
}

这是界面

public interface UrlsSource{
    String getLoginUrl();

    String[] getDashboardUrls();
}

以及下面的实现

@Singleton
public class LocalUrlsSource implements UrlsSource {

    @Inject
    public LocalUrlsSource(){}

    @Override
    public String getLoginUrl() {
        return Properties.LOGIN_URL;
    }

    @Override
    public String[] getDashboardUrls() {
        return Properties.DASHBOARD_URLS;
    }
}

现在在我的主要活动中,我正在注入UrlsRepository,但是它为空。请指导。

public class MainActivity extends Activity implements MainPresenter.View {

    @Inject
    UrlsRepository urlsRepository;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
    }
}

1 个答案:

答案 0 :(得分:1)

如果您不想注入这样的接口,则需要使用带有@Binds注释的方法创建一个@Module。

@Module
abstract class UrlModule {

    @Binds
    abstract UrlsSource bindUrlsSource(LocalUrlsSource source);
}

然后您将创建一个使用此模块的组件,并将其注入您的活动中。

@Component(modules = {UrlModule.class})
@Singleton
public interface AppComponent {

    void inject(MainActivity activity);
}

然后在您的Application.java类中启动该组件,并在您的活动中检索它,并调用inject(),例如这样。

public final class MainApplication extends Application {

    private static AppComponent appComponent;

    public static AppComponent getAppComponent() {
        return appComponent;
    }

    private static AppComponent createAppComponent(Application application) {
        return DaggerAppComponent.create();
    }

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

        appComponent = createAppComponent(this);
    }
}

然后您将像这样注入依赖项。

public class MainActivity extends Activity implements MainPresenter.View {

    @Inject
    UrlsRepository urlsRepository;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        // Injects this activity.
        MainApplication.getAppComponent().inject(this);
    }
}
相关问题