Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Dagger-2如何提供方法参数的依赖关系_Android_Dagger 2_Dagger - Fatal编程技术网

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注入?接受了你的建议并改变了我的实现。谢谢