问题是我尝试在 Dagger 2 中使用字段注入(inject),但在运行时应该注入(inject)的字段始终为 null
。我也尝试使用 MVVM 模式。这是我的代码:
ProfileActivity.java:
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "ProfileActivity: onStart: ");
final ProfileViewModel profileViewModel
= ViewModelProviders.of(this).get(ProfileViewModel.class);
profileViewModel.init();
profileViewModel.getUser().observe(this, new Observer<User>() {
@Override
public void onChanged(@Nullable User user) {
if (user != null) {
Log.d(TAG, "ProfileActivity: onStart: " + user.toString());
} else {
Log.d(TAG, "ProfileActivity: onStart: user == null");
}
}
});
}
ProfileViewModel.java:
public class ProfileViewModel extends ViewModel {
private LiveData<User> user;
@Inject
UserRepository userRepository;
public ProfileViewModel() {
Log.d(TAG, "ProfileViewModel: Constructor: ");
}
public void init() {
Log.d(TAG, "ProfileViewModel: init: ");
user = userRepository.getUser();
}
public LiveData<User> getUser() {
Log.d(TAG, "ProfileViewModel: getUser: ");
return user;
}
}
用户库.java:
@Singleton
public class UserRepository {
private LiveData<User> user;
@Inject
public UserRepository() {
Log.d(TAG, "UserRepository: Constructor: ");
}
public LiveData<User> getUser() {
Log.d(TAG, "UserRepository: getUser: ");
if (user != null) {
return user;
} else {
// There should be userDao.load() call,
// but it had been omitted for brevity.
MutableLiveData<User> user = new MutableLiveData<>();
user.setValue(DB.getUser());
return user;
}
}
}
我的应用程序.java:
public class MyApplication extends MultiDexApplication implements HasActivityInjector {
@Inject
DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;
@Override
public void onCreate() {
super.onCreate();
DaggerMyApplicationComponent.create().inject(this);
}
@Override
public DispatchingAndroidInjector<Activity> activityInjector() {
return dispatchingAndroidInjector;
}
}
MyApplicationModule.java:
@Module
public abstract class MyApplicationModule {
@ContributesAndroidInjector
abstract ProfileActivity contributeActivityInjector();
}
我的应用组件.java:
@Component(modules = { AndroidInjectionModule.class, MyApplicationModule.class})
@Singleton
public interface MyApplicationComponent extends AndroidInjector<MyApplication> {
void inject(ProfileActivity profileActivity);
}
在运行时我可以看到下一个日志:
ProfileActivity: onStart:
ProfileViewModel: Constructor:
ProfileViewModel: init:
应用在 ProfileViewModel
的 init()
方法中的 user = userRepository.getUser();
崩溃。
这意味着 UserRepository
还没有被注入(inject)。它也由缺少 UserRepository: Constructor:
日志指示。
我的错误在哪里?谢谢。
最佳答案
基本上你需要做的是使用 ViewModel Factory
将注入(inject)的 UserRepository
传递到你的 ViewModels
构造函数中,初始化它,然后你将能够使用它。您不能在 ViewModels
中使用字段或参数注入(inject)。
我建议您阅读这篇文章:Add the new ViewModel to your MVVM
它提供了足够的信息来开始使用带有架构组件的 Dagger 2。
希望对您有所帮助。
关于java - Dagger 2 场注入(inject)在 Android 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49714819/