我试图将我的android上下文从一个模块注入另一个模块.到目前为止,这是我的代码:
UserProfileModule.java
@Module( library = true)public class UserProfileModule { @Inject Context _context; @ProvIDes public AccountUtils.UserProfile provIDeUserProfile() { return AccountUtils.getUserProfile(_context); }}
RootModule.java
@Module( injects = { PizzaApplication.class, UserProfileModule.class, MainActivity.class }, includes = { UserProfileModule.class }, library = true)public class RootModule { private final Context _context; public RootModule(Context context) { _context = context; } @ProvIDes @Singleton public Context provIDeApplicationContext() { return _context; }}
每当尝试获取用户配置文件时,都会失败,说明该对象为空.]
编辑:
PizzaApplication.java
public class PizzaApplication extends Application { private ObjectGraph objectGraph; @OverrIDe public voID onCreate() { super.onCreate(); injectDependencIEs(); } private voID injectDependencIEs() { objectGraph = ObjectGraph.create(new RootModule(this)); objectGraph.inject(this); } public voID inject(Object object) { objectGraph.inject(object); }}
MainActivity.java
public class MainActivity extends BaseActivity { @InjectVIEw(R.ID.toolbar) public Toolbar _toolbar; @InjectVIEw(R.ID.drawer) public DrawerFrameLayout _drawer; @Inject public AccountUtils.UserProfile _profile; @Inject public Context _context; // private NavigationDrawerFragment navigationDrawerFragment; @OverrIDe protected voID onCreate(Bundle saveInstanceState) {
解决方法:
tl; dr(精简版):
>有关代码的最小工作示例,请参见my code on GitHub
>您不需要/不应该将上下文从一个模块注入到另一个模块中.
>模块包含的顺序/方向相反,UserProfileModule应包含RootModule.
有关您的代码的更多详细信息和注释:
>您不需要向模块中注入任何东西,模块仅提供依赖关系.在您的情况下,只需利用模块include即可提供所需的功能.
>从UserProfileModule中删除库= true,因为只有在注入列表中指定的类未全部直接使用模块的提供程序时,才需要此库.
>正如NIEk Haarman所说,您需要将RootModule和UserProfileModule实例都传递给PizzaApplication的onCreate中的ObjectGraph.create.
>您在PizzaApplication中正在执行inject(this),但是它没有依赖项,因此没有必要进行注入.根据您提供的示例代码,这使我认为您假设在应用程序级别进行注入也将注入Activity依赖项…?您还需要对Activity进行注入.
>您不会显示是否要在Activity的onCreate中进行注入-这很可能是缺少的.
>您正在将Context注入到Activity中,但这不是必需的,因为您只能在Activity中使用getApplicationContext().
这是工作代码:
根模块:
@Module( injects = {MainActivity.class}, library = true, complete = false)public class RootModule { private final Context _context; public RootModule(Context context) { _context = context; } @ProvIDes @Singleton public Context provIDeApplicationContext() { return _context; }}
UserProfileModule:
@Module(includes = {RootModule.class})public class UserProfileModule { @ProvIDes public AccountUtils.UserProfile provIDeUserProfile(Context context) { return AccountUtils.getUserProfile(context); }}
主要活动:
public class MainActivity extends BaseActivity { @Inject public AccountUtils.UserProfile _profile; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); ((PizzaApplication) getApplication()).inject(this); _profile.message(); }
披萨应用:
public class PizzaApplication extends Application { private ObjectGraph objectGraph; @OverrIDe public voID onCreate() { super.onCreate(); objectGraph = ObjectGraph.create(new RootModule(this), new UserProfileModule()); } public voID inject(Object object) { objectGraph.inject(object); }}
总结 以上是内存溢出为你收集整理的java-使用匕首将字段注入模块全部内容,希望文章能够帮你解决java-使用匕首将字段注入模块所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)