我在 Dagger 2 中遇到了与范围相关的错误,我正在尝试了解如何解决它。
我有一个CompaniesActivity
这表明公司。当用户选择一个项目时,所选公司的员工会显示在EmployeesActivity
。当用户选择一名员工时,她的详细信息显示在EmployeeDetailActivity
.
class Company {
List<Employee> employees;
}
Class CompaniesViewModel
包含公司和选定的公司(或null
):
class CompaniesViewModel {
List<Company> companies;
Company selected;
}
CompaniesActivity
有参考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
包含员工和选定的员工(或null
):
class EmployeesViewModel {
List<Employee> employees;
Employee selected;
}
EmployeesActivity
有参考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));
}
}
最后,在EmployeeDetailActivity
,我从视图模型中选择 Employee 并显示她的详细信息:
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
因为EmployeesViewModel
实例在EmployeesActivity
不一样EmployeeDetailActivity
并且,在第二个中,viewModel.selected
is null
.
这是我的匕首模块:
@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;
}
}
注意CompaniesViewModel
是单例(@Singleton
) but EmployeesViewModel
不是,因为每次用户选择公司时都必须重新创建它(员工列表将包含其他项目)。
I could set
公司员工至EmployeesViewModel
每次用户选择一个公司,而不是创建一个新实例。但我想CompaniesViewModel
是一成不变的。
我该如何解决这个问题?任何建议将不胜感激。