Yam*_*ion 2 java android dependency-injection dagger-2
问题是我尝试使用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");
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
UserRepository.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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
MyApplication.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;
}
}
Run Code Online (Sandbox Code Playgroud)
MyApplicationModule.java:
@Module
public abstract class MyApplicationModule {
@ContributesAndroidInjector
abstract ProfileActivity contributeActivityInjector();
}
Run Code Online (Sandbox Code Playgroud)
MyApplicationComponent.java:
@Component(modules = { AndroidInjectionModule.class, MyApplicationModule.class})
@Singleton
public interface MyApplicationComponent extends AndroidInjector<MyApplication> {
void inject(ProfileActivity profileActivity);
}
Run Code Online (Sandbox Code Playgroud)
在运行时,我可以看到下一个日志:
ProfileActivity: onStart:
ProfileViewModel: Constructor:
ProfileViewModel: init:
Run Code Online (Sandbox Code Playgroud)
应用程序崩溃了user = userRepository.getUser();内部ProfileViewModel的init()方法.
这意味着UserRepository没有注射.此外,它由缺少UserRepository: Constructor:日志表示.
我的错误在哪里?谢谢.
基本上你需要做的是使用ViewModel Factory注入UserRepository到你的ViewModels构造函数,初始化它然后你就可以使用它.您不能使用字段或参数注入ViewModels.
我建议你遵循这篇文章:将新的ViewModel添加到你的MVVM中
它提供了足够的信息来开始使用Dagger 2和Architecture Components.
希望能帮助到你.
| 归档时间: |
|
| 查看次数: |
545 次 |
| 最近记录: |