java-使用匕首将字段注入模块

java-使用匕首将字段注入模块,第1张

概述我试图将我的android上下文从一个模块注入另一个模块.到目前为止,这是我的代码:UserProfileModule.java@Module(library=true)publicclassUserProfileModule{@InjectContext_context;@ProvidespublicAccountUtils.UserProfileprovideUserPr

我试图将我的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-使用匕首将字段注入模块所遇到的程序开发问题。

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

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

原文地址: http://outofmemory.cn/web/1089071.html

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

发表评论

登录后才能评论

评论列表(0条)

保存