gpt4 book ai didi

java - 使用 Dagger 将场注入(inject)模块

转载 作者:太空宇宙 更新时间:2023-11-03 13:20:35 25 4
gpt4 key购买 nike

我正在尝试将我的 android 上下文从一个模块注入(inject)到另一个模块。到目前为止,这是我的代码:

UserProfileModule.java

@Module(
library = true
)
public class UserProfileModule {

@Inject Context _context;

@Provides
public AccountUtils.UserProfile provideUserProfile() {
return AccountUtils.getUserProfile(_context);
}
}

根模块.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);
}
}

主 Activity .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(简短版):

  1. 有关代码的最小工作示例,请参阅 my code on GitHub
  2. 您不需要/不应该将 Context 从一个模块注入(inject)到另一个模块。
  3. 模块 includes 的顺序/方向是相反的,UserProfileModule 应该包含 RootModule。

关于您的代码的更多详细信息和评论:

  1. 您不需要向模块中注入(inject)任何东西,模块只提供依赖项。在您的情况下,只需使用模块 includes 即可提供您想要的功能。
  2. UserProfileModule 中删除 library = true,因为只有当 注入(inject)中指定的类不直接使用模块的提供者时,您才需要它 列表。
  3. 正如 Niek Haarman 所说,您需要在 PizzaApplication 的 onCreate 中将 RootModuleUserProfileModule 实例传递给 ObjectGraph.create
  4. 您正在 PizzaApplication 中执行 inject(this) 但它没有依赖项,因此不需要注入(inject)。根据您提供的示例代码,这让我觉得您假设在应用程序级别注入(inject)也会注入(inject) Activity 依赖项......?您也需要对您的 Activity 进行注入(inject)。
  5. 如果您在 Activity 的 onCreate 中进行注入(inject),则不会显示 - 这很可能是缺失的。
  6. 您正在将 Context 注入(inject) 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;
}
}

用户配置文件模块:

@Module(includes = {RootModule.class})
public class UserProfileModule {
@Provides
public AccountUtils.UserProfile provideUserProfile(Context context) {
return AccountUtils.getUserProfile(context);
}
}

主要 Activity :

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 - 使用 Dagger 将场注入(inject)模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28651474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com