Объекты после ввода ноль - PullRequest
       5

Объекты после ввода ноль

0 голосов
/ 29 декабря 2018

Я пытаюсь внедрить объекты, которые являются синглетонами, в действие 2.
Моя проблема в том, что объекты "Молоко и кофе" после @Inject не заданы в Activity.На мой взгляд, я что-то упускаю.
Пожалуйста, помогите мне и скажите, что отсутствует в коде

AppComponent:

@Singleton
@Component(modules = {CoffeeModule.class, MilkModule.class})
public interface AppComponent {

    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder appModule(MyMvpApp myMvpApp);

        AppComponent build();

    }
    void inject(MyMvpApp app);
}

CoffeeModule:

@Module
public class CoffeeModule {

    @Provides
    @Singleton
    Coffee getCoffee(){
        return new Coffee();
    }

}

MilkModule:

@Module
public class MilkModule {

    @Provides
    @Singleton
    Milk getMilk(){
        return new Milk();
    }

}

Приложение моего класса:

public class MyMvpApp extends Application{

    @Override
    public void onCreate() {
        super.onCreate();
        initDagger();
    }

    private void initDagger() {
        AppComponent appComponent = DaggerAppComponent.builder()
                .appModule(this)
                .build();
        appComponent.inject(this);
    }

}

И моя активность, для которой эти объекты имеют значение null:

public class LoginActivity extends AppCompatActivity {

    @Inject
    Milk milk;

    @Inject
    Coffee coffee;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        Log.i("tag", "" + milk + coffee);
    }
}

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018
@Singleton
@Component(modules = {CoffeeModule.class, MilkModule.class})
public interface AppComponent {

  void inject(LoginActivity app);

  @Component.Builder
  interface Builder {
    @BindsInstance
    Builder appModule(MyMvpApp myMvpApp);

    AppComponent build();
  }
}



public class LoginActivity extends AppCompatActivity {
  @Inject
  Milk milk;

  @Inject
  Coffee coffee;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    DaggerAppComponent.builder().appModule((MyMvpApp) getApplicationContext()).build().inject(this);
    Log.i("tag", "" + milk + coffee);
  }
}


public class MyMvpApp extends Application {

  @Override
  public void onCreate() {
    super.onCreate();
    initDagger();
  }

  private void initDagger() {
    AppComponent appComponent = DaggerAppComponent.builder()
        .appModule(this)
        .build();
  }
}
0 голосов
/ 29 декабря 2018

Вы должны добавить еще две строки в свой класс AppComponent.

void inject(MyMvpApp app);

//you need to provide milk and coffee here
Milk getMilk();
Coffee getCoffee();

Редактировать 1: еще одна вещь, которую вам нужно добавить в компонент приложения.

void inject(LoginActivity loginActivity);

и вызовите метод initDagger в упражнении таким же образом, как вы делаете это в своем классе Application.

Edit 2: Если вы не хотите повторять все это, создайте один метод в своем классе приложения, как этот:

 private AppComponent appComponent ;

 public AppComponent getAppComponent(){
  if (appComponent == null) {
        appComponent = DaggerAppComponent.builder()
            .appModule(this)
            .build();
    }
    return appComponent;
}

 public void initDagger(){
  appComponent.inject(this);
}

Внутри класса onCreate of Application вызывайте эти методы.

getAppComponent();
initDagger();

Внутри своей деятельности вы можете делать это, вместо того, чтобы снова и снова инициализировать весь модуль.

public void initDagger(){
getApplication().getAppCompoment().inject(this);
}
...