如何注入一个变量取决于两个不同的用例?

时间:2016-01-30 16:01:26

标签: java android dependency-injection dagger-2

情况是我需要在我的Activity中注入一个变量(它将是ViewModel),我可以从两个不同的按钮推送:

  • 橙色按钮 - 正在减法
  • 绿色按钮 - 正在添加

enter image description here

我们推送哪个按钮并不重要,它们都引导我们进行另一个活动,但ViewModel将根据按钮执行不同的工作。

我想知道如何在构造函数或其他选项中放置标记的有效方法。

这是我的代码(BaseActivity):

public abstract class BaseActivity extends AppCompatActivity {

protected ApplicationComponent applicationComponent;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    initDIComponent();
    super.onCreate(savedInstanceState);
    applicationComponent = getApplicationComponent();
}

/**
 * Get the Main Application component for dependency injection.
 *
 * @return {@link com.denis.mypocket.internal.di.components.ApplicationComponent}
 */
public ApplicationComponent getApplicationComponent() {
    return ((MyPocketApp) getApplication()).getApplicationComponent();
}

/**
 * Get an Activity module for dependency injection.
 *
 * @return {@link com.denis.mypocket.internal.di.modules.ActivityModule}
 */
protected ActivityModule getActivityModule() {
    return new ActivityModule(this);
}

使用ViewModel的活动:

public class AddTransactionActivity extends BaseActivity {

@Inject
public AddTransactionViewModel viewModel;
private ActivityAddTransactionBinding binding;
private boolean isIncome = false;


@Override
public void onCreate(Bundle savedInstanceState) {
    isIncome = getIntent().getBooleanExtra(PLConstants.INTENT_INCOME_FLAG,false);
    super.onCreate(savedInstanceState);
    binding = DataBindingUtil.setContentView(this, R.layout.activity_add_transaction);
    binding.setViewModel(viewModel);
    binding.addTrans.setOnClickListener(viewModel.addOnClick);
    configireToolbar(binding.toolbarAddTrans.toolbar, R.string.toolbar_add_trans, true);
}


@Override
protected void initDIComponent() {
     DaggerAddTransactionComponent.builder()
            .applicationComponent(getApplicationComponent())
            .activityModule(getActivityModule())
            .build().inject(this);
}

1 个答案:

答案 0 :(得分:1)

@Module用于提供依赖项。如果您使用2个不同的用例重复使用相同的活动,则需要更改模块。

只需在模块构造函数中添加intenum参数,并传入要使用的类型(加法或减法)。要检索您只需编写的类型,并从您的意图附加内容中读取它。

由于您似乎在为所有活动使用相同的BaseModule,因此您可能希望为此创建另一个模块。