我有一个模块FragmentModule
@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 providesPickerDashboard(int status, String name, Object someComplexObject)提供依赖关系的最佳和最简单的方法,即状态、名称和someComplexObject。
诚挚的问候
发布于 2017-07-10 12:19:11
将属性和Provides方法添加到模块中,如下所示:
@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的模块可能会使您使用一些限定符(如Named)来避免冲突。
发布于 2017-07-12 09:56:57
不要使用匕首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());
}
}然而,在另一个层次上,您似乎在问如何组合参数和依赖项。解决这些问题的一个好办法往往是工厂。假设您有一个CoffeeMaker:
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);
}
}https://stackoverflow.com/questions/45011596
复制相似问题