标签: dagger

Square Dagger IllegalStateException:无法加载类MyApplicationModule的模块适配器

我在我的Android项目中使用eclipse和Dagger 1.2.2.我设法用Dagger实现了一个测试应用程序.但是通过我的"真实"应用程序,我得到:

java.lang.RuntimeException:无法创建应用程序app.MyApplication:java.lang.IllegalStateException:无法加载类app.MyApplicationModule的模块适配器.请确保为此模块运行代码生成.:

FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to create application app.MyApplication: java.lang.IllegalStateException: Module adapter for class app.MyApplicationModule could not be loaded. Please ensure that code generation was run for this module.
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4687)
    at android.app.ActivityThread.access$1400(ActivityThread.java:159)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1376)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:5419)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:525)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: Module adapter for class app.MyApplicationModule could not be loaded. Please ensure that code generation was run for this module.
    at …
Run Code Online (Sandbox Code Playgroud)

android dependency-injection dagger

15
推荐指数
2
解决办法
7485
查看次数

Android上的Dagger 2:在Activity中注入相同的依赖项并保留Fragment

我有一个类的对象F1F2我想在保留片段注入.我还有一个A依赖于Activity 的类对象,我希望它被注入到该Activity中,并且保留在与Activity的Fragment Manager相连的Fragment中.我写下面的代码.首先,Activity依赖的模块:

@Module
public class MainActivityModule {
    private Activity mActivity;

    public MainActivityModule(Activity activity) {
        mActivity = activity;
    }

    @Provides
    @ActivityScope
    public A provideA() {
        return new A(mActivity);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,相应的组件必须使A对象可用于其依赖组件:

@ActivityScope
@Component(modules = {MainActivityModule.class})
public interface MainActivityComponent {
    void inject(MainActivity activity);

    // make the A object available to dependent components
    A getA();
}
Run Code Online (Sandbox Code Playgroud)

我还写了与Fragment相关的模块:

@Module
public class FragmentModule {
    @Provides
    @FragmentScope
    public F1 provideF1() {
        return new F1();
    }

    @Provides
    @FragmentScope …
Run Code Online (Sandbox Code Playgroud)

android dependency-injection android-fragments dagger dagger-2

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

用Dagger注入泛型类

我的项目中有一个抽象基类

public abstract class BaseActivity<T extends BasePresenter<? extends IBaseView>> implements IBaseView{
Run Code Online (Sandbox Code Playgroud)

我尝试注入这样的泛型类:

@Inject protected T mPresenter; 
Run Code Online (Sandbox Code Playgroud)

有没有办法让匕首与这种通用注射一起工作?Dagger生成如下代码:

public final class BaseActivity$$InjectAdapter extends Binding<BaseActivity>
implements MembersInjector<BaseActivity> {
    private Binding<T> mPresenter;
}
Run Code Online (Sandbox Code Playgroud)

然后失败因为"T无法解析为某种类型".有没有办法让它生成一个

Binding<SomethingExtendingBasePresenter> mPresenter
Run Code Online (Sandbox Code Playgroud)

在这种情况下?

android dependency-injection dagger

14
推荐指数
1
解决办法
2048
查看次数

通过eclipse构建的Dagger示例失败,并且"请确保为此模块运行代码生成".

我在Android中使用Dagger进行依赖注入,使用Eclipse进行构建.我已经克隆了android-activity-graphs作为例子.

我根据来自https://github.com/square/dagger/issues/126的staxgr设置了我的环境. 这些是我的库:dagger-1.1.0.jar,dagger-compiler-1.1.0.jar,以及javax.inject.jar

最后,我已经将Eclipse中的源文件夹更改为指向src/main/java(而不仅仅是src/),以便Eclipse通过package关键字检测相关文件.

该项目构建,但在运行此异常时立即失败:

Caused by: java.lang.IllegalStateException: 
    Module adapter for class 
    com.example.dagger.activitygraphs.AndroidModule could not be loaded. 
    Please ensure that code generation was run for this module.

at dagger.internal.FailoverLoader.getModuleAdapter(FailoverLoader.java:41)
at dagger.internal.Modules.getAllModuleAdapters(Modules.java:43)
at dagger.ObjectGraph$DaggerObjectGraph.makeGraph(ObjectGraph.java:167)
at dagger.ObjectGraph$DaggerObjectGraph.access$000(ObjectGraph.java:134)
at dagger.ObjectGraph.create(ObjectGraph.java:126)
at com.example.dagger.activitygraphs.DemoApplication.onCreate(DemoApplication.java:29)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1000)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4391)
Run Code Online (Sandbox Code Playgroud)

如何通过eclipse获得Dagger示例?

android dagger

14
推荐指数
1
解决办法
7509
查看次数

运行Espresso测试时,Dagger代码给出NoClassDefFoundError,正常运行正常

开始探索Espresso 2.0,但似乎遇到了打嗝.我无法让测试成功运行任何包含Dagger的项目.当我运行测试时,我得到以下异常(最后的整个堆栈跟踪):

java.lang.NoClassDefFoundError: com/pdt/daggerexample/model/DaggerExampleAppModule$$ModuleAdapter$ProvideMySingletonProvidesAdapter
Run Code Online (Sandbox Code Playgroud)

应用程序在未从AndroidInstrumentationTest运行时运行.

以下是一些相关文件,我还将项目上传到github,以便更快地结账/复制https://github.com/paul-turner/espressoDaggerExample.

的build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.pdt.daggerexample"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        minSdkVersion 16
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled false
        }


    }

    packagingOptions {
        exclude 'LICENSE.txt'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/services/javax.annotation.processing.Processor'
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
    compile 'com.jakewharton:butterknife:5.1.1'
    compile 'com.squareup.dagger:dagger:1.2.2'
    provided 'com.squareup.dagger:dagger-compiler:1.2.2' …
Run Code Online (Sandbox Code Playgroud)

android android-testing dagger android-espresso

14
推荐指数
1
解决办法
4736
查看次数

Dagger 2问题覆盖单一提供了应用程序使用的库中的模块的注释方法

GitHub项目链接

在GitHub上做了一个项目,它是我项目实际架构的匕首2架构的模型.这个问题将基于GitHub项目.

我在这个问题中提供了很多代码片段,但是,在Android Studio中自己编译项目以理解问题可能更容易.

如果你检查代码,它将无法编译.进入AppModule.java并注释掉两个提供方法,它应该编译.

主要问题是这篇文章的最后一行.

https://github.com/qazimusab/Dagger2LibraryProject

建筑

我有一个库,其中包含制作应用程序所需的所有代码.这个架构的重点是我在项目中创建的每个应用程序都应该能够使用库,并且通过dagger 2,能够为它自己的模块中的任何单个类或活动提供不同的实现.此时,我在此示例项目中只有一个使用该库的应用程序.

问题

使用dagger,我有相同的体系结构,在app特定的模块(而不是库模块)中,我能够添加一个新的提供注释方法来覆盖任何库模块中提供的任何实现只要

  1. 该方法位于app模块的模块中
  2. 该方法使用@Provides注释
  3. 该方法具有与要覆盖的方法相同的返回类型

使用Dagger 2时,架构可以在我不覆盖任何提供时工作,或者如果我这样做,当我覆盖该模块中的每个提供并从特定于应用程序模块的包中删除该模块时.

例如,在我的项目中,我有一个应用程序和一个库.

该应用程序有一个AppModule; 图书馆有一个CatModule提供Cat和CatFood,一个狗模块提供Dog and DogFood,以及一个LibraryModule提供活动.

CatModule.java

package com.example.qaziahmed.library.application.modules;

import com.example.qaziahmed.library.classes.Cat; import
com.example.qaziahmed.library.classes.CatFood; import
com.example.qaziahmed.library.classes.contract.ICat; import
com.example.qaziahmed.library.classes.contract.ICatFood;

import javax.inject.Singleton;

import dagger.Module; import dagger.Provides;

/**  * Created by qaziahmed on 11/23/15.  */ @Module public class
CatModule {

    @Provides
    @Singleton
    ICat provideCat() {
        return new Cat();
    }

    @Provides
    ICatFood provideCatFood(){
        return new CatFood();
    } }
Run Code Online (Sandbox Code Playgroud)

DogModule.java

package com.example.qaziahmed.library.application.modules;

import com.example.qaziahmed.library.classes.Dog; import
com.example.qaziahmed.library.classes.DogFood; …
Run Code Online (Sandbox Code Playgroud)

java android dependency-injection dagger dagger-2

14
推荐指数
2
解决办法
8138
查看次数

Android Dagger 2:Inject vs. Provide

我有一个关于Android Dagger 2以及使用@Inject@Provide注释的问题.给出以下两个简化示例:

public class A {
  String msg;

  public A(String msg){
    this.msg = msg;
  }
}

public class B {
  public A a;

  public B(A a){
    this.a = a;
  }
}

@Module
public class AModule {
  @Provides
  A providesA(){
    return new A("blah");
  }

  @Provides
  B ProvidesB(A a)
  {
    return new B(a);
  }
}
Run Code Online (Sandbox Code Playgroud)

这个例子是非常简单的,我在我的两个方法AModule@Provides注解.因此,Dagger可以创建一个B使用A字符串实例的对象blah.

我的第二个例子如下:

public class A {
  String msg;

  public A(String msg){
    this.msg …
Run Code Online (Sandbox Code Playgroud)

android dependency-injection dagger

14
推荐指数
1
解决办法
2953
查看次数

使用Dagger 2 + Kotlin + ViewModel注入ViewModel

class SlideshowViewModel : ViewModel() {

@Inject lateinit var mediaItemRepository : MediaItemRepository

fun init() {
    What goes here?
}
Run Code Online (Sandbox Code Playgroud)

所以我正在尝试学习Dagger2,这样我就可以让我的应用程序更加可测试.问题是,我已经集成了Kotlin并正在研究Android Architectural组件.我知道构造函数注入是优选的,但这是不可能的ViewModel.相反,我可以使用lateinit以便注射,但我不知道如何注射.

我是否需要创建一个Componentfor SlideshowViewModel,然后注入它?或者我使用该Application组件?

gradle这个:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'

kapt { 
    generateStubs = true
}
dependencies {
    compile "com.google.dagger:dagger:2.8"
    annotationProcessor "com.google.dagger:dagger-compiler:2.8"
    provided 'javax.annotation:jsr250-api:1.0'
    compile 'javax.inject:javax.inject:1'
}
Run Code Online (Sandbox Code Playgroud)

应用组件

@ApplicationScope
@Component (modules = PersistenceModule.class)
public interface ApplicationComponent {

    void injectBaseApplication(BaseApplication baseApplication);
}
Run Code Online (Sandbox Code Playgroud)

BaseApplication

    private static ApplicationComponent component;

    @Override
    public void onCreate() {
        super.onCreate(); …
Run Code Online (Sandbox Code Playgroud)

android dependency-injection kotlin dagger dagger-2

14
推荐指数
3
解决办法
4915
查看次数

无法创建自定义ViewModel的实例

我正在使用dagger2库.每当我试图运行我的项目时,都表示无法创建视图模型类的实例.

我正在尝试创建实例的主要活动

   ((MovieApplication) getApplication()).getAppComponent().inject(this);
    mViewModel = ViewModelProviders.of(this).get(MoviesDataViewModel.class);
Run Code Online (Sandbox Code Playgroud)

我的工厂班

public class ViewModelFactory implements ViewModelProvider.Factory {
private MoviesDataViewModel mViewModel;

@Inject
public ViewModelFactory(MoviesDataViewModel viewModel) {
    this.mViewModel = viewModel;
}

@Override
public <T extends ViewModel> T create(Class<T> modelClass) {
    if (modelClass.isAssignableFrom(MoviesDataViewModel.class)) {
        return (T) mViewModel;
    }
    throw new IllegalArgumentException("Unknown class name");
}
Run Code Online (Sandbox Code Playgroud)

我的日志

  Caused by: java.lang.RuntimeException: Cannot create an instance of class com.moviedata.viewmodel.MoviesDataViewModel
                                                               at android.arch.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:145)
                                                               at android.arch.lifecycle.ViewModelProviders$DefaultFactory.create(ViewModelProviders.java:143)
                                                               at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:128)
                                                               at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:96)
                                                               at com.moviedata.ui.MainActivity.onCreate(MainActivity.java:28)
                                                               at android.app.Activity.performCreate(Activity.java:6321)
                                                               at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
                                                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2426)
                                                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2535) 
                                                               at android.app.ActivityThread.access$1100(ActivityThread.java:154) 
                                                               at …
Run Code Online (Sandbox Code Playgroud)

android dependency-injection dagger dagger-2 android-architecture-components

14
推荐指数
1
解决办法
5908
查看次数

Dagger 2无法访问Retrofit

我正在尝试使用Dagger 2(使用Android模块)向我的存储库提供一个Retrofit实例.买我面临错误:

错误:无法访问Retrofit

像毕加索这样的其他实例注入成功,我只是在改造时遇到了问题.

我的模块

@Module
class NetworkModule {

@Provides
@Singleton
fun providesRetrofit(): Retrofit {
    return Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create())
            .baseUrl(URL_BASE)
            .build()
}

@Provides
@Singleton
fun providesPicasso(context: Context): Picasso {
    return Picasso.Builder(context)
            .loggingEnabled(true)
            .build()
}

@Provides
@Singleton
fun providesRemoteRepository(retrofit: Retrofit): RemoteRepository = RemoteRepository(retrofit)

@Provides
@Singleton
fun providesRepository(remote: RemoteRepository): Repository = RepositoryImp(remote)

}
Run Code Online (Sandbox Code Playgroud)

我的应用程序组件

@Singleton
@Component(modules = arrayOf(
        AppModule::class, NetworkModule::class, AndroidInjectionModule::class, ActivityBuilder::class
))
interface AppComponent {

    @Component.Builder
    interface Builder {

        @BindsInstance
        fun application(app: Application): Builder

        fun build(): AppComponent

    }

    fun inject(application: AppApplication)

} …
Run Code Online (Sandbox Code Playgroud)

android kotlin dagger dagger-2 retrofit2

13
推荐指数
1
解决办法
2625
查看次数