Android Dagger-2如何为方法参数提供依赖
Android Dagger-2 how to provide the dependency for method parameters
我有一个模块 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;
}
}
这是我的组件 class
@Component(modules = {UtilModule.class, FragmentModule.class})
public interface ApplicationComponent
{
void inject(PickerDashboardActivity target);
}
在我的 activity 中,这就是我注入 PickerDashboardActivity
的方式
@Inject
PickerDashboardFragment frag;
ApplicationComponent component = DaggerApplicationComponent.builder().build();
component.inject(this);
我的 问题 是为 PickerDashboardFragment providesPickerDashboard(int status, String name, Object someComplexObject)
提供依赖项的最好和最简单的方法,即状态、名称和 someComplexObject。
此致
像这样向您的模块添加属性和 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;
}
}
拥有一个提供整数和字符串的模块可能会让您使用一些限定符(例如 Named
)以避免冲突
不要使用 Dagger 2 将片段注入到您的活动中。为什么?片段的生命周期由 Android OS 控制。当您使用事务将片段添加到 Activity 时,FragmentManager 将保留对该片段的引用。当 Activity instanceState
保存时,添加到 FragmentManager 的 Fragment 将被保存。当 Activity 恢复时,如果您请求注入而不检查 FragmentManager 中是否存在 Fragment,您的 Activity 将开始引用 Fragment 的两个实例并造成内存泄漏。
因此,在 void onCreate(Bundle savedInstanceState)
方法中,您应该检查 FragmentManager 中是否存在保留的 Fragment,而不是从 Dagger 2 请求注入。如果未保留 Fragment,那么您可以在那个时候实例化它观点。为此使用 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);
}
}
工厂是依赖和参数组合的标准解决方案see here and they can even be be generated using code generation tools like Google Auto。
我有一个模块 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;
}
}
这是我的组件 class
@Component(modules = {UtilModule.class, FragmentModule.class})
public interface ApplicationComponent
{
void inject(PickerDashboardActivity target);
}
在我的 activity 中,这就是我注入 PickerDashboardActivity
@Inject
PickerDashboardFragment frag;
ApplicationComponent component = DaggerApplicationComponent.builder().build();
component.inject(this);
我的 问题 是为 PickerDashboardFragment providesPickerDashboard(int status, String name, Object someComplexObject)
提供依赖项的最好和最简单的方法,即状态、名称和 someComplexObject。
此致
像这样向您的模块添加属性和 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;
}
}
拥有一个提供整数和字符串的模块可能会让您使用一些限定符(例如 Named
)以避免冲突
不要使用 Dagger 2 将片段注入到您的活动中。为什么?片段的生命周期由 Android OS 控制。当您使用事务将片段添加到 Activity 时,FragmentManager 将保留对该片段的引用。当 Activity instanceState
保存时,添加到 FragmentManager 的 Fragment 将被保存。当 Activity 恢复时,如果您请求注入而不检查 FragmentManager 中是否存在 Fragment,您的 Activity 将开始引用 Fragment 的两个实例并造成内存泄漏。
因此,在 void onCreate(Bundle savedInstanceState)
方法中,您应该检查 FragmentManager 中是否存在保留的 Fragment,而不是从 Dagger 2 请求注入。如果未保留 Fragment,那么您可以在那个时候实例化它观点。为此使用 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);
}
}
工厂是依赖和参数组合的标准解决方案see here and they can even be be generated using code generation tools like Google Auto。