[android]Dagger2 子注入项目为空

发布时间: 2017/3/19 4:30:45
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

使用 dagger2 的简单示例

更新

我有一个有电脑的电机类和水泵类。我把它们写这样为什么子注入部分电机是空的吗?

这是我马达类与检查计算机和水泵启动的 startEngin 方法。

public class Motor {

    @Inject
    public Computer computer;

    @Inject
    public WaterPump waterPump;


    public Motor(){
    }

// here computer and waterPump are null and not injected
    public boolean startEngin(){
        if(computer!=null && waterPump!=null){
            return true;
        }else{
            return false;
        }
    }

}

和这是计算机具有的类的模型名称和电压︰

public class Computer {

    private int vultage;
    private String model;

    public Computer(String model ,int vultage){

        this.model=model;
        this.vultage = vultage;
    }
}

和这是水泵︰

public class WaterPump {

    private String name;
    public WaterPump(String name){
        this.name = name;
    }
}

这是我的模块︰

@Module
public class MotorModule {

    Context context;
    String motoName;
    String computerName;
    String waterPupName;
    int voltage;

    public MotorModule(Context context, String computerName, String waterPupName, int voltage) {
        this.context = context;
        this.waterPupName = waterPupName;
        this.computerName = computerName;
        this.voltage = voltage;
    }

    @Provides
    @Singleton
    Motor provideMotor() {
        return new Motor();
    }

    @Provides
    @Singleton
    Computer provideComputer() {
        return new Computer(computerName, voltage);
    }

    @Provides
    @Singleton
    WaterPump provideWaterPump() {
        return new WaterPump(waterPupName);
    }

    @Provides
    @Singleton
    Context provideContext() {
        return this.context;
    }

}

这是我的组件类,知道没有必要对 getMotor 方法。

@Singleton
@Component(modules = {MotorModule.class})
public interface MotorComponent {

//    Motor getMotor();
    void inject(MainActivity activty);

和在这里的 activity 注入的电机为 null:

public class MainActivity extends AppCompatActivity {

    @Inject
    public Motor motor;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DaggerMotorComponent.builder().motorModule(new MotorModule
                (this, "mahdi'PC", "my " +
                        "Water pump", 12)).build().inject(this);

        if (motor.startEngin()) {

            Toast.makeText(this, "it is started", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "motor is not provided", Toast.LENGTH_SHORT).show();
        }

    }

}

}

解决方法 1:

看上去没什么问题对我来说,除了电机类本身。你注明与 @Inject 的两个字段 (所以 Dagger 现在知道它可以注入的东西),但你从来没有真正请求 Dagger '' 这些变量使用数据来填充。 你应该显式请求填充这些数据在您的代码的某个地方。 1 的办法做到这一点是通过 '构造函数注入',所以这就是如何您的构造函数应该看起来像

public Motor(Computer computer, WaterPump waterPump) {
this.computer = computer;
this.waterPump = waterPump;
}

......在模块︰

@Provides
@Singleton
Motor provideMotor(Computer computer, Waterpump waterpump) {
    return new Motor(computer, waterpump);
}

或者您可以调用 dagger 实例从您的电机 consctructor,并做一些像︰

myDaggerInstance.inject(this);

记得要批注的电机具有 @Inject 的构造函数和 annotation

使用无论哪种方式,你明确告诉 Dagger 履行这些依赖项在一些 pointtime ,所以他们再也不能为空。干杯 !

赞助商