首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android 2如何提供方法参数的依赖关系

问Android 2如何提供方法参数的依赖关系
EN

Stack Overflow用户
提问于 2017-07-10 12:06:46
回答 2查看 2K关注 0票数 0

我有一个模块FragmentModule

代码语言:javascript
复制
@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;
    }
}

这是我的组件类

代码语言:javascript
复制
@Component(modules = {UtilModule.class, FragmentModule.class})
public interface ApplicationComponent
{
    void inject(PickerDashboardActivity target);
}

在我的活动中,我就是这样注射PickerDashboardActivity的

代码语言:javascript
复制
@Inject 
PickerDashboardFragment frag;

ApplicationComponent component = DaggerApplicationComponent.builder().build();
        component.inject(this);

我的问题是为PickerDashboardFragment providesPickerDashboard(int status, String name, Object someComplexObject)提供依赖关系的最佳和最简单的方法,即状态、名称和someComplexObject。

诚挚的问候

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-10 12:19:11

将属性和Provides方法添加到模块中,如下所示:

代码语言:javascript
复制
@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)来避免冲突。

票数 2
EN

Stack Overflow用户

发布于 2017-07-12 09:56:57

不要使用匕首2在你的活动中注入碎片。为什么?片段有一个由Android操作系统控制的生命周期。当您使用事务向活动添加片段时,FragmentManager将保留对该片段的引用。保存活动instanceState时,将保存添加到FragmentManager中的片段。当活动被恢复时,如果您请求注入而没有检查片段在FragmentManager中的存在,您的活动将开始引用该片段的两个实例并创建一个内存泄漏。

因此,在void onCreate(Bundle savedInstanceState)方法中,您应该检查FragmentManager中是否存在保留的片段,而不是从Dagger 2请求注入。如果片段没有保留,那么可以在此时实例化它。为此使用new关键字或静态工厂是非常好的。

示例:

代码语言:javascript
复制
MyFragment frag;

void onCreate(Bundle savedInstanceState) {
     setContentView(R.layout.content);
     frag = fragmentManager.findFragmentByTag(MyFragment.TAG);
     if (frag == null) {
         frag = MyFragment.instantiate(new Bundle());
     }
}

然而,在另一个层次上,您似乎在问如何组合参数和依赖项。解决这些问题的一个好办法往往是工厂。假设您有一个CoffeeMaker:

代码语言:javascript
复制
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注入它:

代码语言:javascript
复制
 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);
     }
 }

工厂是依赖关系和参数请看这里组合的标准解决方案,甚至可以使用代码生成工具(如谷歌汽车 )生成工厂。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45011596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档