首页 / JAVA / java-使用匕首将字段注入模块
java-使用匕首将字段注入模块
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-使用匕首将字段注入模块,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3442字,纯文字阅读大概需要5分钟。
内容图文
我试图将我的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-使用匕首将字段注入模块所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。