问题是,我尝试在Dagger 2中使用字段注入,但在运行时,应该注入的字段总是
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();
}
MyApplicationComponent。java:
@Component(modules = { AndroidInjectionModule.class, MyApplicationModule.class})
@Singleton
public interface MyApplicationComponent extends AndroidInjector<MyApplication> {
void inject(ProfileActivity profileActivity);
}
在运行时,我可以看到下一个日志:
ProfileActivity: onStart:
ProfileViewModel: Constructor:
ProfileViewModel: init:
应用程序崩溃
user = userRepository.getUser();
在…内
ProfileViewModel
的
init()
方法
这意味着
UserRepository
没有注射。也可以通过缺失来表示
UserRepository: Constructor:
日志
我的错在哪里?非常感谢。