我在我的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) 我有一个类的对象F1和F2我想在保留片段注入.我还有一个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
我的项目中有一个抽象基类
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中使用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示例?
开始探索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) GitHub项目链接
我在GitHub上做了一个项目,它是我项目实际架构的匕首2架构的模型.这个问题将基于GitHub项目.
我在这个问题中提供了很多代码片段,但是,在Android Studio中自己编译项目以理解问题可能更容易.
如果你检查代码,它将无法编译.进入AppModule.java并注释掉两个提供方法,它应该编译.
主要问题是这篇文章的最后一行.
https://github.com/qazimusab/Dagger2LibraryProject
建筑
我有一个库,其中包含制作应用程序所需的所有代码.这个架构的重点是我在项目中创建的每个应用程序都应该能够使用库,并且通过dagger 2,能够为它自己的模块中的任何单个类或活动提供不同的实现.此时,我在此示例项目中只有一个使用该库的应用程序.
问题
使用dagger,我有相同的体系结构,在app特定的模块(而不是库模块)中,我能够添加一个新的提供注释方法来覆盖任何库模块中提供的任何实现只要
使用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) 我有一个关于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) 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) 我正在使用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
我正在尝试使用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)