Я новичок в кинжале и вначале сталкиваюсь с некоторыми проблемами. До сих пор у меня есть простая структура в моем проекте. Мой инъекции модуль:Кинжал - вложенные инъекции, нужно ли вызывать инъекцию()?
@Module(
injects = {GameBoardFragment.class, GameManager.class},
complete = false,
library = true
)
public class GameObjectsProviderModule {
private final Application mApplication;
public GameObjectsProviderModule(Application application){
this.mApplication = application;
}
@Provides
@Singleton
public GameManager provideGameManager(){
return new GameManager();
}
@Provides
public Board getBoard(){
return new Board();
}
@Provides @Singleton @ForApplication Context provideAppContext() {
return mApplication;
}
Мой упрощенный пользовательский класс приложение выглядит следующим образом:
public class MyApp extends Application {
private static ObjectGraph mApplicationGraph;
@Override public void onCreate() {
super.onCreate();
mApplicationGraph = ObjectGraph.create(new GameObjectsProviderModule(this));
}
public static ObjectGraph getObjectGraph(){
return mApplicationGraph;
}
}
А теперь, мой фрагмент выглядит так:
public class GameBoardFragment extends Fragment {
@Inject
GameManager mGameManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
MyApp.getObjectGraph().inject(this);
View root = inflater.inflate(R.layout.fragment_game_board, container, false);
findViews(root);
confViews();
return root;
}
}
И, наконец, мой GameManager класс
public class GameManager {
@Inject Board mBoard;
public GameManager(){
MyApp.getObjectGraph().inject(this);
}
}
Andy эй, это работает! Отлично. Но мой вопрос, почему он не работает в случае, если я закомментировать эту строку:
MyApp.getObjectGraph().inject(this);
ли мы всегда явно вызывать впрыснуть функцию(), чтобы сделать все необходимые инъекции иметь место события вложенных объектов? Это выглядит не так, как показывает пример кофе производитель:
https://github.com/square/dagger/tree/master/examples/simple/src/main/java/coffee
Почему я должен назвать инъекционные() в классе GameManager, чтобы заставить его работать?
Edit:
consturctor инъекции подход работает просто отлично.
Но для будущего использования я попытался запустить полевую инъекцию, и до сих пор мне не удалось.
Я закомментирована как @Provide методов из модуля и я сделал GameManager выглядеть следующим образом:
@Singleton
public class GameManager {
@Inject Board mBoard;
@Inject
public GameManager(){
}
}
и платы:
public class Board {
@Inject
public Board() {
}
}
Однако материнка не получает инстанцированную. Я попробую больше, и я полагаю, что я выясню правильное решение.
Спасибо за приятное объяснение! Вы очистили мои сомнения. – JohnC