gpt4 book ai didi

java - 依赖gradle库模块共享代码时如何使用dagger?

转载 作者:行者123 更新时间:2023-12-02 11:58:49 25 4
gpt4 key购买 nike

我正在将项目切换到 dagger。 项目由 :app gradle 模块和 :library gradle 模块组成。 Library 从某种意义上说并不是真正的库,而是在应用程序变体之间共享代码通用代码的一种方式。

所以基本上它提供了例如 BaseFooFragment ,可以通过 FooFragment 由 :app 模块扩展。更具体的例子是 BaseRestManager ,它在整个库中使用。应用程序应该将其扩展到 RestManager。它也应该是一个单例。

如果没有 dagger,我通常会做的是在 :library 模块中提供 BaseApp 应用程序类,提供 BaseRestManager 并在库内使用它。在应用程序模块中,我将 BaseApp 子类为 App 并重写 BaseRestManager ,提供 RestClient 并将返回类型从 BaseRestManager getRestManager 缩小到 RestManager getRestManager ,因此使用 App 代码也不必强制转换它。

顺便说一句,库模块始终是模块,它不需要单独工作。它只是共享代码的一种方式。干燥。

我该如何在 dagger 中做到这一点?如果我有一个返回 BaseRestManager 的 @Provides 方法和返回 RestManager 的第二个 @Provides 方法都注释为 @Singleton,那么它显然会创建 2 个实例,这不是我想要的。它应该只是一个 RestManager 实例。

public abstract class BaseApp extends Application {
public abstract BaseRestManager getRestManager();
}

public class App extends BaseApp {

private RestManager mRestManager;

@Override
public void onCreate() {
super.onCreate();
mRestManager = new RestManager(...);
}

@Override public RestManager getRestManager() {
return mRestManager;
}
}

public class BaseFooFragment extends Fragment {

@Override public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("Default", "BaseFooFragment # baseRestManager=" + ((BaseApp) getActivity().getApplication()).getRestManager());
}
}

public class FooFragment extends BaseFooFragment {

@Override public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("Default", "FooFragment # restManager=" + ((App) getActivity().getApplication()).getRestManager());
}
}

日志语句应打印相同的 RestManager 实例。在 dagger id 中,代码可能看起来像这样

public class BaseFooFragment extends Fragment {

@Inject BaseRestManager mBaseRestManager;

@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((BaseApp) getActivity().getApplication()).getComponent().inject(this);
}
}

public class FooFragment extends Fragment {

@Inject RestManager mRestManager;

@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((App) getActivity().getApplication()).getComponent().inject(this);
}
}

有什么建议吗?谢谢

最佳答案

您可以在 Dagger 中提供接口(interface)的许多子类。比如这个:

FirebaseDataRepository 实现 DataRepository

@Singleton
@Provides
@Named(Scope.FIREBASE)
public DataRepository provideFirebaseData(FirebaseDataRepository repo) {
return repo;
}

您还可以提供另一个AnyDataReposity实现DataRepository

P/s:注入(inject)时您必须指定要使用哪一个:

@Named(Scope.FIREBASE) DataRepository dataRepo

关于java - 依赖gradle库模块共享代码时如何使用dagger?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47405658/

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