Android Dagger-2如何提供方法参数的依赖关系
我有一个模块碎片模块Android Dagger-2如何提供方法参数的依赖关系,android,dagger-2,dagger,Android,Dagger 2,Dagger,我有一个模块碎片模块 @Module public class FragmentModule { @Provides public static PickerDashboardFragment providesPickerDashboard(int status, String name, Object someComplexObject) { PickerDashboardFragment fragment = new PickerDashboardFr
@Module
public class FragmentModule
{
@Provides
public static PickerDashboardFragment providesPickerDashboard(int status, String name, Object someComplexObject)
{
PickerDashboardFragment fragment = new PickerDashboardFragment();
Bundle b = new Bundle();
b.putInt("status", status);
b.putString("name", name);
b.putInt("object", someComplexObject);
fragment.setArguments(bundle);
return fragment;
}
@Provides
public static PickingFragment providesPickingFragment()
{
PickingFragment fragment = new PickingFragment();
return fragment;
}
}
这是我的组件类
@Component(modules = {UtilModule.class, FragmentModule.class})
public interface ApplicationComponent
{
void inject(PickerDashboardActivity target);
}
在我的活动中,这就是我如何注入PickerDashboardActivity
@Inject
PickerDashboardFragment frag;
ApplicationComponent component = DaggerApplicationComponent.builder().build();
component.inject(this);
我的问题是为PickerDashboardFragment ProviderCheckDashboard(int status,String name,Object someComplexObject)
提供依赖项的最佳和最简单的方法,即status,name和someComplexObject
致以最诚挚的问候向您的模块添加属性和
提供如下方法:
@Module
public class FragmentModule
{
private final int status;
private final String name;
private final Object someComplexObject;
public FragmentModule(int status, String name, Object someComplexObject) {
this.status = status;
this.name = name;
this.someComplexObject = someComplexObject;
}
@Provides
int providesStatus() {
return status;
}
@Provides
String providesName() {
return name;
}
@Provides
Object providesSomeComplexObject() {
return someComplexObjext;
}
@Provides
public static PickerDashboardFragment providesPickerDashboard(int status, String name, Object someComplexObject)
{
PickerDashboardFragment fragment = new PickerDashboardFragment();
Bundle b = new Bundle();
b.putInt("status", status);
b.putString("name", name);
b.putInt("object", someComplexObject);
fragment.setArguments(bundle);
return fragment;
}
@Provides
public static PickingFragment providesPickingFragment()
{
PickingFragment fragment = new PickingFragment();
return fragment;
}
}
有一个提供int和string的模块可能会让您使用一些限定符(例如命名的
)来避免冲突不要使用Dagger 2将片段注入到您的活动中。为什么?碎片的生命周期由Android操作系统控制。当您使用事务向活动添加片段时,FragmentManager将保留对片段的引用。保存活动instanceState
时,将保存添加到FragmentManager的片段。当活动恢复时,如果您请求注入而未检查FragmentManager中是否存在该片段,则您的活动将开始引用该片段的两个实例并创建内存泄漏
因此,在void onCreate(Bundle savedInstanceState)
方法中,您应该检查FragmentManager中是否存在保留的片段,而不是请求Dagger 2的注入。如果片段没有被保留,那么您可以在该点实例化它。为此使用new
关键字或静态工厂是非常好的
例如:
MyFragment frag;
void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.content);
frag = fragmentManager.findFragmentByTag(MyFragment.TAG);
if (frag == null) {
frag = MyFragment.instantiate(new Bundle());
}
}
然而,在另一个层面上,您似乎在询问如何组合参数和依赖项。解决这些问题的一个好办法通常是工厂。假设你有一个咖啡机:
class CoffeeMaker {
private final Kettle kettle;
private final Grinder grinder;
private final BeanFlavour beanFlavour;
CoffeeMaker(Kettle kettle, Grinder grinder, BeanFlavour beanFlavour) {
this.kettle = kettle;
this.grinder = grinder;
this.beanFlavour = beanFlavour;
}
}
beanFlavour是可变的(黑暗、烘烤等),并且会变化,因此更像是一个参数,而不是依赖项。然后,您可以编写一个CoffeeMakerFactory,并使用Dagger 2进行注射:
class CoffeeMakerFactory {
private final Kettle kettle;
private final Grinder grinder;
@Inject
CoffeeMakerFactory(Kettle kettle, Grinder grinder) {
this.kettle = kettle;
this.grinder = grinder;
}
public CoffeeMaker create(BeanFlavour beanFlavour) {
return new CoffeeMaker(kettle, grinder, beanFlavour);
}
}
工厂是依赖项和参数组合的标准解决方案,它们甚至可以使用代码生成工具生成,如。感谢您的回答,名称、状态等的值从何而来?在片段模块中,您没有初始化它们!糟糕的是,我忘记了构造函数。我已经更新了我的答案,不用担心。你的答案是正确的,但对我们来说,这似乎有点开销。考虑一下这个模块有更多的方法,每个方法都有不同的参数,所以我必须创建更多的构造函数,从而创建更多的模板。我在想,如果在调用方法时可以完全填充依赖关系,您可以随时删除@Provides
方法并直接使用属性。或者使用另一个模块
来提供这些方法参数依赖性如果ProviderBackerDashboard需要两个字符串参数怎么办?例如,stringfirstname,stringlastname?dagger怎么知道是使用String providesFirstName还是String providesLastName?还有其他人想回答吗?你能提供任何参考吗?我的意思是不要注入碎片@ecDroid请看Google示例项目谢谢David,我认为你是对的。我将更改我的实现,使其不注入片段。请告诉我还有哪些组件我不应该用dagger注入?接受了你的建议并改变了我的实现。谢谢