匕首嵌套嵌套,是否有必要调用inject()?

匕首嵌套嵌套,是否有必要调用inject()?,第1张

概述我是Dagger的新手,一开始我遇到了一些问题.到目前为止,我的项目结构简单.我的注射模块:@Module(injects={GameBoardFragment.class,GameManager.class},complete=false,library=true)publicclassGameObjectsProviderModule{privatefinalApplicatio

我是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@Singletonpublic GameManager provIDeGameManager(){    return new GameManager();}@ProvIDespublic 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 {@InjectGameManager mGameManager;@OverrIDepublic voID onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);}@OverrIDepublic 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

为什么然后我必须在GameManager类中调用inject()才能使其正常工作?

编辑:

构造注入方法很好用.

但是为了将来使用,我尝试运行场注入,但到目前为止,我还没有成功.

我从模块中注释了两个@ProvIDe方法,并使GameManager看起来像这样:

@Singletonpublic class GameManager  {@Inject Board mBoard;@Inject  public GameManager(){}}

董事会:

public class Board {  @Inject  public Board() {  }}

但是,mBoard不会实例化.我会尝试更多,并且我想找出正确的解决方案.

解决方法:

您应该宁愿使用构造函数注入(例如Thermosiphon),除非必要,否则避免进行字段注入.例如,让您的GameManager将Board作为构造函数参数:

@Singletonpublic class GameManager  {  private final Board mBoard;  @Inject  public GameManager(final Board board){      mBoard = board;  }}

Dagger将使用此构造函数创建GameManager的实例(因此@Inject批注),并注意它需要一个Board实例.使用ObjectGraph,它将首先创建一个Board,然后使用该实例创建GameManager.如果您这样做,则可以删除@ProvIDes GameManager方法.

就您而言,您的模块中有一个@ProvIDes Board方法.如果将@Inject批注添加到Board构造函数中,则可以从模块中删除以下提供方法:

public class Board {  @Inject  public Board() {  }}

如果您不想使用构造函数注入,则问题在于您告诉Dagger您想自己创建GameManager实例(因为您具有@ProvIDes GameManager方法).如果删除此方法,并让Dagger像上面那样为您创建它,但在构造函数中没有Board参数,则Dagger也将注意到@Inject Board字段并将其注入.

最后的评论.删除库= true和complete = false语句!这些在此示例中根本没有必要.仅当您确实知道自己在做什么时才添加它们.如果没有它们,Dagger将创建编译时错误,以通知您某些错误.如果您确实包括了它们,则是对Dagger说:“嘿,我知道我在做什么,不用担心,这都是正确的”,而实际上并非如此.

编辑

来自Dagger1网站的报价:

If your class has @Inject-annotated fIElds but no @Inject-annotated
constructor, Dagger will use a no-argument constructor if it exists.
Classes that lack @Inject annotations cannot be constructed by Dagger.

我不经常使用此方法,所以我可能是错的.我认为这意味着您应该从构造函数中删除@Inject批注,如下所示:

@Singletonpublic class GameManager  {  @Inject Board mBoard;  public GameManager(){ // Or remove the constructor entirely since it's empty  }}

由于在Board字段上有一个@Inject批注,因此Dagger会知道使用无参数构造函数.

总结

以上是内存溢出为你收集整理的匕首嵌套嵌套,是否有必要调用inject()?全部内容,希望文章能够帮你解决匕首嵌套嵌套,是否有必要调用inject()?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1079058.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存