标签: dagger

Dagger 2 - @Singleton注释类的目的是什么

从匕首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)

dependency-injection dagger dagger-2

46
推荐指数
3
解决办法
3万
查看次数

使用dagger2进行依赖注入时,我可以注入超类吗?

我在我的android应用程序中使用Dagger2 for DI.我发现我必须为每个使用@Inject字段的类编写inject方法.有没有办法我可以注入父类,这样我就不必在每个子类上调用注入?以活动为例.我有一个BaseActivity每个活动都延伸出来的.有没有办法可以在组件中为BaseActivity创建一个注入方法,只需在BaseActivity的onCreate中调用注入,子活动中的@inject字段会自动注入?

java android dependency-injection dagger dagger-2

44
推荐指数
2
解决办法
2万
查看次数

Dagger 2错误:依赖"无法在没有@Inject构造函数的情况下提供",而它实际上是用@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)

android dagger dagger-2

44
推荐指数
4
解决办法
6万
查看次数

Dagger:IllegalArgumentException:没有为Class绑定的进程工厂

我是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)

android dependency-injection dagger dagger-2

44
推荐指数
1
解决办法
2万
查看次数

Dagger 2 Generic Type类注入错误

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)

generics dependency-injection dagger

35
推荐指数
3
解决办法
1万
查看次数

未生成Dagger 2组件

在我的模块中,在我的基础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)

android dagger

35
推荐指数
4
解决办法
3万
查看次数

Kotlin错误:Dagger不支持注入私人领域

我在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 dependency-injection kotlin dagger dagger-2

35
推荐指数
7
解决办法
1万
查看次数

不推荐使用 ApplicationComponent 吗?

我刚开始在 Android 上使用 Dagger Hilt 进行依赖注入,我在 Android Studio 上收到一条警告说'ApplicationComponent' is deprecated. Deprecated in Java.

我在谷歌搜索时没有找到与此警告相关的任何内容,它实际上已被弃用还是使用安全?

我还在 Dagger 的网站上注意到他们没有在“迁移到刀柄”指南中的任何地方提及它,他们使用的@InstallIn(SingletonComponent::class)似乎有效,但我不知道为什么。

android dagger dagger-hilt

33
推荐指数
2
解决办法
5830
查看次数

什么时候在Android应用程序中使用Dagger?

我知道Dagger是一个依赖注入框架,但我还没有在我的项目中使用它.

我正在开始一个新项目,并想知道Dagger是否适合它.据我所知,使用Dagger会产生许多样板代码和注释.因此,我不确定这对我相对简单的项目是否有点过分.

关于这个项目.它专注于图像处理,功能的主要部分是围绕它构建的.但是,它也可能有一个简单的数据存储后端.

总的来说,我想知道一些基本原则,我可以选择使用Dagger进行项目.

android dagger

32
推荐指数
1
解决办法
6798
查看次数

Dagger 2 - two提供了提供相同接口的方法

让我说我有:

public interface Shape  {}


public class Rectangle implements Shape {

}

public class Circle implements Shape {

}
Run Code Online (Sandbox Code Playgroud)

我有一个ApplicationModule,它需要为RecCircle提供实例:

@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)

java android dependency-injection dagger dagger-2

31
推荐指数
3
解决办法
1万
查看次数