I have an scope-related error in Dagger 2 and I'm trying to understand how I can solve it.
I have a CompaniesActivity
that shows companies. When the user selects an item, selected company's employees are shown in EmployeesActivity
. When the user selects an employee, her detail is shown in EmployeeDetailActivity
.
class Company {
List<Employee> employees;
}
Class CompaniesViewModel
contains the companies and the selected one (or null
):
class CompaniesViewModel {
List<Company> companies;
Company selected;
}
CompaniesActivity
has a reference to CompaniesViewModel
:
class CompaniesActivity extends Activity {
@Inject
CompaniesViewModel viewModel;
@Override
protected void onCreate(Bundle b) {
//more stuff
getComponent().inject(this);
showCompanies(viewModel.companies);
}
//more stuff
private onCompanySelected(Company company) {
viewModel.selected = company;
startActivity(new Intent(this, EmployeesActivity.class));
}
}
Class EmployeesViewModel
contains the employees and the selected one (or null
):
class EmployeesViewModel {
List<Employee> employees;
Employee selected;
}
EmployeesActivity
has a reference to EmployeesViewModel
:
class EmployeesActivity extends Activity {
@Inject
EmployeesViewModel viewModel;
@Override
protected void onCreate(Bundle b) {
//more stuff
getComponent().inject(this);
showEmployees(viewModel.employees);
}
//more stuff
private onEmployeeSelected(Employee emp) {
viewModel.selected = emp;
startActivity(new Intent(this, EmployeeDetailActivity.class));
}
}
Finally, in EmployeeDetailActivity
, I get selected Employee from view model and show her detail:
class EmployeeDetailActivity extends Activity {
@Inject
EmployeesViewModel viewModel;
@Override
protected void onCreate(Bundle b) {
//more stuff
getComponent().inject(this);
showEmployeeDetail(viewModel.selected); // NullPointerException
}
}
I get NullPointerException
because EmployeesViewModel
instance in EmployeesActivity
is not the same as the EmployeeDetailActivity
and, in the second one, viewModel.selected
is null
.
This is my dagger module:
@Module
class MainModule {
@Provides
@Singleton
public CompaniesViewModel providesCompaniesViewModel() {
CompaniesViewModel cvm = new CompaniesViewModel();
cvm.companies = getCompanies();
return cvm;
}
@Provides
public EmployeesViewModel providesEmployeesViewModel(CompaniesViewModel cvm) {
EmployeesViewModel evm = new EmployeesViewModel();
evm.employees = cvm.selected.employees;
return evm;
}
}
Note that CompaniesViewModel
is singleton (@Singleton
) but EmployeesViewModel
is not, because it has to be recreated each time user selects a company (employees list will contain other items).
I could set
the company's employees to EmployeesViewModel
each time user selects a company, instead of create a new instance. But I would like CompaniesViewModel
to be immutable.
How can I solve this? Any advise will be appreciated.