gpt4 book ai didi

android - Dagger2 如何执行具有默认构造函数依赖性的构造函数注入(inject)

转载 作者:行者123 更新时间:2023-11-29 23:03:35 25 4
gpt4 key购买 nike

我想请问如何注入(inject)没有任何参数的构造函数。我遇到过这个问题,但找不到解决方案。这是我的 repo 类(class)

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;
}
}

现在在我的主要 Activity 中,我正在注入(inject) 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);
}
}

最佳答案

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

@Module
abstract class UrlModule {

@Binds
abstract UrlsSource bindUrlsSource(LocalUrlsSource source);
}

然后您将创建一个使用此模块的组件并注入(inject)到您的 Activity 中。

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

void inject(MainActivity activity);
}

然后在您的 Application.java 类中启动该组件并在您的 Activity 中检索它并调用 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);
}
}

然后你会像这样注入(inject)依赖。

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);
}
}

关于android - Dagger2 如何执行具有默认构造函数依赖性的构造函数注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56748490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com