2017-02-12 4 views
2

У меня есть компонент, какDagger 2 не впрыскивать свой объект, но может быть получен из компонента

@GithubListActivityScope 
@Component(modules = { GithubListActivityModule.class,GlideActivityModule.class }) 
public interface GithubListActivityComponent { 

GithubUserListAdapter githubUserListAdapter (); 
RequestManager requestManager(); 
LinearLayoutManager linearLayoutManager(); 

} 

И у меня есть модуль вроде этого:

@Module 
public class GithubListActivityModule { 
private final Activity githubListActivity; 


public GithubListActivityModule (Activity activity) { 
    this.githubListActivity = activity; 

} 

@Provides 
@GithubListActivityScope 
Activity activity () { 
    return this.githubListActivity; 
} 

@Provides 
@GithubListActivityScope 
public LinearLayoutManager linearLayoutManager(Activity activity){ 
    return new LinearLayoutManager (activity); 
} 
} 

Проблема: У меня есть трейд в введите LinearLayout manager следующим образом:

@GithubListActivityScope 
@Inject 
LinearLayoutManager linearLayoutManager; 

Хотя мой компонент построен следующим образом:

githubListActivityComponent = DaggerGithubListActivityComponent.builder() 
      .githubListActivityModule (new GithubListActivityModule (this)) 
      .build(); 

Мой менеджер линейных макетов не получает экземпляр. Но когда я вручную делаю

linearLayoutManager = githubListActivityComponent.linearLayoutManager(); 

Он отлично работает. Где я иду не так?

ответ

3

Везде, что я передаю Activity, я должен пройти точнотот жеимя класса (а не его родителя) Так один раз редактировалось каждые параметры и типы, которые были "Activity" в "GithubListActivity" вернуться, а затем добавил

void inject(GithubListActivity activity); 

внутри component class

затем INJ ected "GithubListActivity" так:

DaggerGithubListActivityComponent.builder() 
      .githubListActivityModule (new GithubListActivityModule (this)) 
      .build().inject (this); 

Тогда коды работали для меня ..

Урок:
1. Определить метод INJECT и Inject текущей деятельности

2. Используйте точно тот же тип объекта (а не родительский) в этом случае использует «GithubListActivity» вместо просто активности.

+0

Это означает, что мы определим многие методы интерфейса с разными именами деятельности? – Idee

+0

Если мы не будем работать над этой идеей, тогда да, мы должны вводить все виды деятельности.Но какой-то другой классный парень в Интернете может иметь решение для этого тоже :) – erluxman

1

Dagger 2 не вводит поля автоматически. Он также не может вводить частные поля. Если вы хотите использовать полевую инъекцию, вам необходимо определить метод в вашем интерфейсе @Component, который принимает экземпляр, в который вы хотите ввести как параметр (От - http://www.vogella.com/tutorials/Dagger/article.html#special-treatment-of-fields-in-dagger)

Предположим, у вас есть фрагмент или деятельность, в которую вы хотите вводить эту зависимость, то сделать что-то вроде этого -

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ((YouApplicationClass) getActivity().getApplication()).getmComponent().inject(this); 
} 

Пусть ваш класса Application быть, как это -

public class YourApplicationClass extends MultiDexApplication { 

    private static final String TAG = v.class.getSimpleName(); 

    private YourComponent mComponent; 

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

     mComponent = DaggerYoutComponent.builder() 
       .yourModule(new YourModule(this)) 
       .build(); 
    } 

    public YourComponent getmComponent() { 
     return mComponent; 
    } 

    .... lots of other code 
} 

и ваш компонент класса быть что-то вроде этого -

//@Singleton 
@Component(modules = {YourModule.class}) 
public interface YourComponent { 

    void inject(Fragment yourFragment); //the parameter can be any class who is invoking this method i.e. Passing the reference to itself 

    ..lots of other code 
}