Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android dagger2模块无法注入其他模块_Java_Android_Dagger_Dagger 2 - Fatal编程技术网

Java Android dagger2模块无法注入其他模块

Java Android dagger2模块无法注入其他模块,java,android,dagger,dagger-2,Java,Android,Dagger,Dagger 2,我正在努力学习如何使用匕首。您是否应该为您拥有的每个模块制作一个组件(然后在“超级组件”中组合组件) 我有两个模块可以工作,他们以前有单独的组件。然后我添加了一个额外的模块(没有组件),在新模块中,我的@Inject似乎不起作用 如何使我的AppModule能够注入到我的新GyroModule中 我的新“陀螺”模块: @Module public class GyroModule implements SensorEventListener { @Inject AppModule _appMod

我正在努力学习如何使用匕首。您是否应该为您拥有的每个模块制作一个组件(然后在“超级组件”中组合组件)

我有两个模块可以工作,他们以前有单独的组件。然后我添加了一个额外的模块(没有组件),在新模块中,我的@Inject似乎不起作用

如何使我的AppModule能够注入到我的新GyroModule中

我的新“陀螺”模块:

@Module
public class GyroModule implements SensorEventListener {
@Inject AppModule _appModule;  // NULL

private SensorEvent _lastReading;
private SensorManager _sensorManager;
private Sensor _gyro;

@Inject
public GyroModule() {
    initialize();
}

@Provides
@Singleton
public GyroModule provideGyroModule() {
    return this;
}
@Singleton
@Component(modules={AppModule.class,
        PointOfInterestModule.class,
        LocationModule.class,
        GyroModule.class})
public interface IAppComponent {
    void inject(AllTheLocateApplication application);
    void inject(MainActivity mainActivity);
    void inject(AugmentedActivity augmentedActivity);

    void inject(AppModule appModule);
    void inject(PointOfInterestModule pointOfInterestModule);
    void inject(LocationModule locationModule);
    void inject(GyroModule gyroModule);
}
我的主要活动:

public class MainActivity extends LocationAwareActivity {
    @Inject PointOfInterestModule pointOfInterestModule; // OK
    @Inject LocationModule locationModule;               // OK

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ((AllTheLocateApplication) getApplication()).getAppComponent().inject(this);

        setContentView(R.layout.activity_main);

        Intent intent = new Intent(this, AugmentedActivity.class);
        startActivity(intent);
    }
}
我的“上帝”组件(也是应用程序中唯一的组件):

@Module
public class GyroModule implements SensorEventListener {
@Inject AppModule _appModule;  // NULL

private SensorEvent _lastReading;
private SensorManager _sensorManager;
private Sensor _gyro;

@Inject
public GyroModule() {
    initialize();
}

@Provides
@Singleton
public GyroModule provideGyroModule() {
    return this;
}
@Singleton
@Component(modules={AppModule.class,
        PointOfInterestModule.class,
        LocationModule.class,
        GyroModule.class})
public interface IAppComponent {
    void inject(AllTheLocateApplication application);
    void inject(MainActivity mainActivity);
    void inject(AugmentedActivity augmentedActivity);

    void inject(AppModule appModule);
    void inject(PointOfInterestModule pointOfInterestModule);
    void inject(LocationModule locationModule);
    void inject(GyroModule gyroModule);
}
我的AppModule

@Module
public class AppModule {

    AllTheLocateApplication mApplication;

    public AppModule(AllTheLocateApplication application) {
        mApplication = application;
    }

    public AllTheLocateApplication getApplication() {
        return mApplication;
    }

    @Provides
    @Singleton
    AppModule providesAppModule() {
        return this;
    }
}
您是否应该为您拥有的每个模块制作一个组件[…]

没有

[…](然后在“超级组件”中组合组件)

没有


模块应该是您的计划B,并清楚地表达出来-除非真的有必要,否则应不惜一切代价避免使用。您需要使用模块的原因有三个:

  • 无法使用构造函数注入创建依赖项
  • 依赖项需要在创建时进一步初始化
  • 依赖项正在实现接口,而您正在提供实现
如果其中至少一个不是真的,不要使用模块

注射 模块与注入无关。它们不应该也不应该包含您的业务逻辑。它们所做的只是提供那些无法访问或注入构造函数的对象。他们不能被注射,也不能被注射。如果一个对象依赖于另一个对象,则将其作为方法中的参数。如果您不想自己调用构造函数,dagger将只为您创建模块,因为没有参数构造函数

initialize()
方法不应该是模块的一部分。如果必须提供A和A需要,则应如下所示:

@Provides
provideA(B b) {
    A a = new A();
    a.setB(b);
    a.doMoreInitializationThatMustBeDoneNow();
    return a;
}
B是否由同一模块、不同模块、父组件、组件依赖项或构造函数注入提供,与您无关。模块之间不需要相互了解,dagger只需使用B调用您的方法,然后您只需返回A


我不知道你想用你的代码样本做什么。模块不是业务逻辑的一部分。它们提供依赖关系。您不应该依赖业务逻辑中的模块。也不应该包含getter、setter或更新任何对象。模块创建一个对象并初始化它。他们不会以任何其他方式与之互动

通过创建一个java文件来使用dagger。添加一些模块。放入一个您试图注入一些依赖项的类。你可以看到事情是如何编译的(或者不编译)。也许可以尝试阅读更多关于dagger的教程,以便更好地理解核心概念

您是否应该为您拥有的每个模块制作一个组件[…]

没有

[…](然后在“超级组件”中组合组件)

没有


模块应该是您的计划B,并清楚地表达出来-除非真的有必要,否则应不惜一切代价避免使用。您需要使用模块的原因有三个:

  • 无法使用构造函数注入创建依赖项
  • 依赖项需要在创建时进一步初始化
  • 依赖项正在实现接口,而您正在提供实现
如果其中至少一个不是真的,不要使用模块

注射 模块与注入无关。它们不应该也不应该包含您的业务逻辑。它们所做的只是提供那些无法访问或注入构造函数的对象。他们不能被注射,也不能被注射。如果一个对象依赖于另一个对象,则将其作为方法中的参数。如果您不想自己调用构造函数,dagger将只为您创建模块,因为没有参数构造函数

initialize()
方法不应该是模块的一部分。如果必须提供A和A需要,则应如下所示:

@Provides
provideA(B b) {
    A a = new A();
    a.setB(b);
    a.doMoreInitializationThatMustBeDoneNow();
    return a;
}
B是否由同一模块、不同模块、父组件、组件依赖项或构造函数注入提供,与您无关。模块之间不需要相互了解,dagger只需使用B调用您的方法,然后您只需返回A


我不知道你想用你的代码样本做什么。模块不是业务逻辑的一部分。它们提供依赖关系。您不应该依赖业务逻辑中的模块。也不应该包含getter、setter或更新任何对象。模块创建一个对象并初始化它。他们不会以任何其他方式与之互动

通过创建一个java文件来使用dagger。添加一些模块。放入一个您试图注入一些依赖项的类。你可以看到事情是如何编译的(或者不编译)。也许可以尝试阅读更多关于dagger的教程,以便更好地理解核心概念