从匕首2 文档我注意到你可以有一个带@Singleton注释的类.标记类的目的是什么,@Singleton因为我试图在我的代码中执行此操作,但不生成单例对象.我不清楚用这个注释标记我的类的用途.
请从文档中关注以下声明:
注入类上的@Singleton注释也可用作文档.它提醒潜在的维护者,这个类可能被多个线程共享.*
@Singleton
class CoffeeMaker {
...
}
Run Code Online (Sandbox Code Playgroud)
更新:在查看froger_mcs答案后,我看到在Dagger 2中你可以通过模块或构造函数注入提供注射.因此,可以注入以下类,尽管不在模块中,
@Singleton
public class MyClass {
@Inject
public MyClass() {
}
}
Run Code Online (Sandbox Code Playgroud)
在这个版本中,构造函数是为我们注入的,在Android活动中,您只需执行以下操作即可获得:
@Inject
MyClass myClass;
//then in onCreate actually inject(this) from your graph of course.
Run Code Online (Sandbox Code Playgroud) 我在我的android应用程序中使用Dagger2 for DI.我发现我必须为每个使用@Inject字段的类编写inject方法.有没有办法我可以注入父类,这样我就不必在每个子类上调用注入?以活动为例.我有一个BaseActivity每个活动都延伸出来的.有没有办法可以在组件中为BaseActivity创建一个注入方法,只需在BaseActivity的onCreate中调用注入,子活动中的@inject字段会自动注入?
我开始使用Dagger 2并遇到一个奇怪的问题,看起来像是一个bug.
我有3个模块,它们组成一个子组件,后者又扩展/加载更高级别的组件.
子组件非常简单:只需组合模块和单个注入点:
@Singleton
@Subcomponent(
modules = {
NavigationDrawerModule.class,
NavigationListModule.class,
SwitcherModule.class
}
)
public interface NavigationDrawerComponent {
NavigationDrawerFragment inject(NavigationDrawerFragment object);
}
Run Code Online (Sandbox Code Playgroud)
第一个模块看起来像这样 - 它提供了一般的片段级依赖关系:
@Module
public class NavigationDrawerModule {
private final Activity activity;
private final View rootView;
private final LoaderManager loaderManager;
public NavigationDrawerModule(Activity activity, View rootView, LoaderManager loaderManager) {
this.activity = activity;
this.rootView = rootView;
this.loaderManager = loaderManager;
}
@Provides @Singleton EventBus provideLocalBus() {
return EventBus.builder().build();
}
@Provides @Singleton View provideViewRoot() {
return rootView;
}
@Provides @Singleton LoaderManager provideLoaderManager() …Run Code Online (Sandbox Code Playgroud) 我是Dagger 2的新手.我有2个活动,我想使用注入的ViewModel.这是我的ViewModuleFactory:
@Singleton
public class ProductViewModelFactory implements ViewModelProvider.Factory {
private final Map<Class<? extends ViewModel>, Provider<ViewModel>> creators;
@Inject
public ProductViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> creators) {
this.creators = creators;
}
@SuppressWarnings("unchecked")
@Override
public <T extends ViewModel> T create(Class<T> modelClass) {
Provider<? extends ViewModel> creator = creators.get(modelClass);
if (creator == null) {
for (Map.Entry<Class<? extends ViewModel>, Provider<ViewModel>> entry : creators.entrySet()) {
if (modelClass.isAssignableFrom(entry.getKey())) {
creator = entry.getValue();
break;
}
}
}
if (creator == null) {
throw new IllegalArgumentException("unknown viewmodel class …Run Code Online (Sandbox Code Playgroud) MyClass由于它的通用特性,我无法让这里注入.
Dagger抱怨这个错误:
错误:(187,10)错误:com.test.MyClass有类型参数,不能成员注入原始类型.via:com.test.MyComponent.inject(com.test.MyClass obj)[类型的组件注入方法:com.test.MyClass]
我用谷歌搜索了一下但无法找到这种情况的解决方案.
class MyClass<Type> {
@Inject
UserCredentials userCredentials;
ResultProducer<Type> mRP;
public MyClass(ResultProducer<Type> resultProd) {
mRP = resultProd;
Injector.getComponent().inject(this);
}
public Type getResult() {
if (userCredentials.isLoggedIn()) {
mRP.get();
} else {
mRP.getAnonymousCache();
}
}
}
@Component(modules = CredentialsModule.class )
interface MyComponent {
void inject(MyClass obj);
}
@Module
class CredentialsModule {
@Provides
public UserCredentials provideUserCredentials() {
return new UserCredentials();
}
}
Run Code Online (Sandbox Code Playgroud) 在我的模块中,在我的基础Application类中
component = DaggerCompClassComponent.builder()
.classModule(new ModuleClass()).build();
Run Code Online (Sandbox Code Playgroud)
它找不到DaggerCompClassComponent.
我有模块build.gradle
apply plugin: 'com.neenbedankt.android-apt'
.........................
apt 'com.google.dagger:dagger-compiler:2.8'
compile 'com.google.dagger:dagger:2.8'
provided 'javax.annotation:jsr250-api:1.0'
Run Code Online (Sandbox Code Playgroud)
在Project build.gradle中,
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
Run Code Online (Sandbox Code Playgroud)
我已经完成了build/rebuild/clean/restart项目.我有一个Component类,我在其中注入对象和一个ModuleClass,我提供了要注入的对象.
不生成Dagger组件的原因是什么.上课?
编辑:
这是我的ModuleClass,用@Module注释:
@Provides
@Singleton
public Interceptor provideInterceptor() {
return new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request.Builder builder = chain.request().newBuilder();
builder.addHeader("AppName-Android", BuildConfig.VERSION_NAME + "-" + BuildConfig.VERSION_CODE)
.addHeader("Content-Type", "application/json");
return chain.proceed(builder.build());
}
};
}
@Provides
@Singleton
OkHttpClient provideOkHttpClient(Interceptor interceptor) {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.interceptors().add(interceptor);
return builder.build();
}
@Provides
@Singleton
Retrofit provideRetrofit(OkHttpClient …Run Code Online (Sandbox Code Playgroud) 我在kotlin活动中使用ViewPager,我希望在Kotlin Fragment中使用匕首注射.我有错误:Dagger不支持注入私有字段.在Java Fragment中匕首注射工作.为什么我不能在kotlin片段中注入匕首?
在我的kotlin活动中
mPagerAdapter = object : FragmentPagerAdapter(supportFragmentManager) {
private val mFragments = arrayOf(KotlinFragment(), JavaFragment())
private val mFragmentNames = arrayOf(getString(R.string.cashdocuments), getString(R.string.action_absmysql))
override fun getItem(position: Int): Fragment {
return mFragments[position]
}
override fun getCount(): Int {
return mFragments.size
}
override fun getPageTitle(position: Int): CharSequence {
return mFragmentNames[position]
}
}
Run Code Online (Sandbox Code Playgroud)
我的kotlin片段
class KotlinFragment : Fragment() {
@Inject
internal var mSharedPreferences: SharedPreferences? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
(activity.application as SamfantozziApp).dgaeacomponent().inject(this)
}
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
savedInstanceState: Bundle?): …Run Code Online (Sandbox Code Playgroud) 我刚开始在 Android 上使用 Dagger Hilt 进行依赖注入,我在 Android Studio 上收到一条警告说'ApplicationComponent' is deprecated. Deprecated in Java.
我在谷歌搜索时没有找到与此警告相关的任何内容,它实际上已被弃用还是使用安全?
我还在 Dagger 的网站上注意到他们没有在“迁移到刀柄”指南中的任何地方提及它,他们使用的@InstallIn(SingletonComponent::class)似乎有效,但我不知道为什么。
我知道Dagger是一个依赖注入框架,但我还没有在我的项目中使用它.
我正在开始一个新项目,并想知道Dagger是否适合它.据我所知,使用Dagger会产生许多样板代码和注释.因此,我不确定这对我相对简单的项目是否有点过分.
关于这个项目.它专注于图像处理,功能的主要部分是围绕它构建的.但是,它也可能有一个简单的数据存储后端.
总的来说,我想知道一些基本原则,我可以选择使用Dagger进行项目.
让我说我有:
public interface Shape {}
public class Rectangle implements Shape {
}
public class Circle implements Shape {
}
Run Code Online (Sandbox Code Playgroud)
我有一个ApplicationModule,它需要为Rec和Circle提供实例:
@Module
public class ApplicationModule {
private Shape rec;
private Shape circle;
public ApplicationModule() {
rec = new Rectangle();
circle= new Circle ();
}
@Provides
public Shape provideRectangle() {
return rec ;
}
@Provides
public Shape provideCircle() {
return circle;
}
}
Run Code Online (Sandbox Code Playgroud)
和ApplicationComponent:
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
Shape provideRectangle();
} …Run Code Online (Sandbox Code Playgroud)