/ / Dagger2 élément sous-injecté est null - java, android, dépendance-injection, null, dagger-2

L'élément sous-injecté Dagger2 est null - java, android, dépendance-injection, null, dagger-2

exemple simple d'utilisation de dagger2

ACTUALISÉ

J'ai une classe de moteur qui a l'ordinateur et la classe de pompe à eau. Je les écris comme ça par pourquoi les pièces sous-injectées dans Motor sont nulles?

C'est ma classe de moteur avec la méthode startEngin qui vérifie l'ordinateur et waterPump pour démarrer.

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;
}
}

}

et voici la classe Computer qui a le nom du modèle et la tension:

public class Computer {

private int vultage;
private String model;

public Computer(String model ,int vultage){

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

et c'est WaterPump:

public class WaterPump {

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

c'est mon module:

@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;
}

}

et c'est ma classe de composants, je sais qu'il n'y a pas besoin de la méthode getMotor.

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

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

et ici en activité moteur injecté est nul:

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();
}

}

}

}

Réponses:

2 pour la réponse № 1

Tout me semble correct, sauf pour la classe Motorlui-même. Vous avez annoté deux champs avec @Inject (donc Dagger sait maintenant qu'il peut y injecter des éléments), mais vous ne demandez jamais à Dagger de "remplir" ces variables avec des données. Vous devriez explicitement demander de renseigner ces données quelque part dans votre code. Une façon de le faire est d’injecter le constructeur, c’est donc à ça que votre constructeur devrait ressembler.

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

... et en module:

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

OU vous pouvez appeler une instance de poignard depuis le serveur de votre moteur et faire quelque chose comme:

myDaggerInstance.inject(this);

et n'oubliez pas d'annoter le constructeur de Motor avec l'annotation @Inject.

De toute façon, vous avez dit explicitement à Dagger de répondre à ces dépendances à un moment donné, elles ne seront donc plus nulles. A la vôtre!


1 pour la réponse № 2

Vous devez enregistrer la référence à MotorComponentexemple et l’utiliser pour injecter dans les classes Activtiy et Motor. Ajoutez void inject (Moteur m) à votre composant et appelez Component.inject (myMotor) ou utilisez plutôt l'injection de constructeur sur la classe Motor.

public class Motor {

Computer computer;
WaterPump waterPump;


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

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

}

/** Add method, providing Motor class instance - it will use another
.provide() methods from this component to get computer and waterpump objects
(Costtructor injection)
*/

/**
* Arguments is provided by DI
* @param computer
* @param waterPump
* @return
*/
@Provides
@Singleton
Motor provideMotors(Computer computer, WaterPump waterPump) {
Motor motor = new Motor(computer, waterPump);
return motor
}

/** Store reference to your component (better do it in Application) */

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

// inject into Activity
componen.inhject(this);

1 pour la réponse № 3
@Provides
@Singleton
Motor provideMotor() {
return new Motor();
}

Et

public class Motor {

@Inject
public Computer computer;

@Inject
public WaterPump waterPump;


public Motor(){
}

Devrait être l'un des suivants:

1.)

@Singleton
public class Motor {
@Inject
public Computer computer;

@Inject
public WaterPump waterPump;

@Inject
public Motor() {
}

Et

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();
//}

Ou

2.)

public class Motor {
public Computer computer;

public WaterPump waterPump;

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

Et

@Provides
@Singleton
Motor provideMotor(Computer computer, WaterPump waterPump) {
return new Motor(computer, waterPump);
}