2016-12-03 2 views
5

Класс Dagger2 Component содержит 3 модуля, которые я пытаюсь использовать для ввода зависимостей полей в класс активности Android. В сгенерированном файле Component есть комментарии, говорящие, что все модули не используются, связывая этот page для получения дополнительной информации.Dagger2 - «Неиспользованные» модули в классе сгенерированных компонентов

Класс My Activity вызывает метод ввода (Activity) компонента и имеет поля, аннотированные для инъекций, которые предоставляются модулями, поэтому я не уверен, почему сгенерированный файл Component не имеет каких-либо Провайдеров для этой инъекции.

Мой код ниже, спасибо за помощь!

Сформирован компонент Класс:

public final class DaggerMainComponent implements MainComponent { 
     private DaggerMainComponent(Builder builder) { 
     assert builder != null; 
     } 

    public static Builder builder() { 
    return new Builder(); 
    } 

    public static MainComponent create() { 
    return builder().build(); 
    } 

    @Override 
    public void inject(Activity activity) { 
    MembersInjectors.<Activity>noOp().injectMembers(activity); 
    } 

    public static final class Builder { 
    private Builder() {} 

    public MainComponent build() { 
     return new DaggerMainComponent(this); 
    } 

    /** 
    * @deprecated This module is declared, but an instance is not used in the component. This method is a no-op. For more, see https://google.github.io/dagger/unused-modules. 
    */ 
    @Deprecated 
    public Builder daoModule(DaoModule daoModule) { 
     Preconditions.checkNotNull(daoModule); 
     return this; 
    } 

    /** 
    * @deprecated This module is declared, but an instance is not used in the component. This method is a no-op. For more, see https://google.github.io/dagger/unused-modules. 
    */ 
    @Deprecated 
    public Builder repositoryModule(RepositoryModule repositoryModule) { 
     Preconditions.checkNotNull(repositoryModule); 
     return this; 
    } 

    /** 
    * @deprecated This module is declared, but an instance is not used in the component. This method is a no-op. For more, see https://google.github.io/dagger/unused-modules. 
    */ 
    @Deprecated 
    public Builder portableModule(PortableModule portableModule) { 
     Preconditions.checkNotNull(portableModule); 
     return this; 
    } 
    } 
} 

Несгенерированные компоненты класс:

@Component(modules={DaoModule.class,RepositoryModule.class,PortableModule.class}) 
public interface MainComponent { 
    void inject(Activity activity); 
} 

Модуль Классы: Есть ли какие-либо проблемы с наличием одного модуля обеспечивает объект зависимость от другого объекта, предоставленного другим модулем, принадлежащим к одному и тому же компоненту?

@Module 
public class DaoModule { 

    private DatabaseHelper databaseHelper; 

    public DaoModule(DatabaseHelper databaseHelper){ 
     this.databaseHelper = databaseHelper; 
    } 

    @Provides 
    public Dao<Player,Integer> providePlayerDao(){ 
     return databaseHelper.getPlayerDao(); 
    } 

    @Provides 
    public Dao<GamePlayed,Integer> provideGamePlayedDao() { 
     try { 
      return databaseHelper.getDao(GamePlayed.class); 
     } catch (SQLException e) { 
      return null; 
     } 
    } 

    @Provides 
    public Dao<GamePlayer,Integer> provideGamePlayerDao() { 
     try { 
      return databaseHelper.getDao(GamePlayer.class); 
     } catch (SQLException e) { 
      return null; 
     } 
    } 
} 

... 

@Module 
public class RepositoryModule { 

    @Provides 
    public IGameResultRepository provideGameResultRepository(
      Dao<Player,Integer> playerDao, 
      Dao<GamePlayed,Integer> gameDao, 
      Dao<GamePlayer, Integer> gamePlayerDao) 
    { 
     return new OrmliteGameResultRepository(playerDao,gameDao,gamePlayerDao); 
    } 
} 

@Module 
public class PortableModule { 

    @Provides 
    public GameResultListener provideGameResultListener(IGameResultRepository gameResultRepository){ 
     return new GameResultListener(gameResultRepository); 
    } 

} 

Класс Применение:

public class AppStart extends Application { 

    private MainComponent mainComponent; 

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

     DatabaseHelper databaseHelper = new DatabaseHelper(getApplicationContext()); 

     mainComponent = DaggerMainComponent.builder() 
       .daoModule(new DaoModule(databaseHelper)) 
       .build(); 
    } 

    public MainComponent getMainComponent(){ 
     return mainComponent; 
    } 
} 

активность Класс:

public class MyActivity extends Activity { 

    @Inject GameResultListener gameResultListener; 
    @Inject Dao<Player,Integer> dao; 
    @Inject IGameResultRepository repository; 


    @Override 
    protected void onCreate(Bundle state) { 
     super.onCreate(state); 

     ((AppStart)this.getApplication()).getMainComponent().inject(this); 
+0

Какова ваша версию Dagger – EpicPandaForce

+0

Возможного дубликат [Dagger 2.2 компоненты методы модуля строителя осуждается ] (http://stackoverflow.com/questions/36521302/dagger-2-2-component-builder-module-method-deprecated) –

ответ

3

Вопрос 1: Почему мои модули помечается как "неиспользованный"?

Вы не предоставили правильный сайт для инъекций! В соответствии с этим, ваш компонентный интерфейс является одним с единственным местом инъекции android.app.Activity. Так как android.app.Activity не имеет аннотаций @Inject на своих полях, тогда вы получаете инсолятор без операции. Аналогично, ваши модули отмечены как неиспользуемые, потому что ни один из них фактически не используется в качестве источников зависимостей для android.app.Activity. Чтобы это исправить, в вашем компоненте изменений:

void inject(Activity activity); 

к:

void inject(MyActivity myActivity); 

Вопрос 2:

Есть ли какие-либо проблемы с наличием одного модуля обеспечивает объект с зависимостью на другом объекте, предоставленном другим модулем, принадлежащим к одному и тому же компоненту?

Нет, это прекрасно.Чтобы проиллюстрировать это, давайте рассмотрим простой граф объекта:

public class Foo { 

    public Foo(FooDependency fooDependency) {} 
} 

public class FooDependency { 

    FooDependency(String name) {} 
} 

Мы хотим, чтобы ввести его в следующий класс с помощью кинжала:

public class FooConsumer { 

    @Inject Foo foo; 

    private FooConsumer() {} 
} 

Мы хотели бы повторно использовать модуль привязки FooDependency поэтому мы будем писать два отдельных модуля:

@Module 
public class FooModule { 

    @Provides 
    Foo foo(FooDependency fooDependency) { 
     return new Foo(fooDependency); 
    } 
} 

@Module 
public class FooDependencyModule { 

    @Provides 
    FooDependency fooDependency() { 
     return new FooDependency("name"); 
    } 
} 

И следующий интерфейс компонента:

@Component(modules = {FooModule.class, FooDependencyModule.class}) 
public interface FooComponent { 
    void inject(FooConsumer fooConsumer); 
} 

Сгенерированный компонент DaggerFooComponent содержит следующий код, который будет правильно использовать FooDependency из отдельного модуля FooDependencyModule впрыснуть Foo:

@SuppressWarnings("unchecked") 
    private void initialize(final Builder builder) { 

    this.fooDependencyProvider = 
     FooDependencyModule_FooDependencyFactory.create(builder.fooDependencyModule); 

    this.fooProvider = FooModule_FooFactory.create(builder.fooModule, fooDependencyProvider); 

    this.fooConsumerMembersInjector = FooConsumer_MembersInjector.create(fooProvider); 
    } 
+1

Спасибо, что ответили на оба вопроса. Инъекции, не выполняемые для подклассов параметров inject(), очень тонкие – win4fun

Смежные вопросы