我是 Dagger 的新手,一开始我遇到了一些问题。到目前为止,我的项目结构很简单。我的注入模块:
@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);
}
}
安迪嘿,它有效!伟大的。但我的问题是,如果我注释掉这一行,为什么它不起作用:
MyApp.getObjectGraph().inject(this);
我们是否总是显式调用inject()函数来使所有必要的注入发生在嵌套对象中?
看起来不是,如咖啡机示例所示:
https://github.com/square/dagger/tree/master/examples/simple/src/main/java/coffee https://github.com/square/dagger/tree/master/examples/simple/src/main/java/coffee
为什么我必须在 GameManager 类中调用ject() 才能使其正常工作?
Edit:
构造函数注入方法工作得很好。
但为了将来的使用,我尝试运行现场注入,但到目前为止我还没有成功。
我注释掉了模块中的两个 @Provide 方法,并使我的 GameManager 看起来像这样:
@Singleton
public class GameManager {
@Inject Board mBoard;
@Inject
public GameManager(){
}
}
和董事会:
public class Board {
@Inject
public Board() {
}
}
但是 mBoard 不会被实例化。我会尝试更多,我想我会找到正确的解决方案。