Dagger 2现场注入在Android中不起作用

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();内部ProfileViewModelinit()方法.

这意味着UserRepository没有注射.此外,它由缺少UserRepository: Constructor:日志表示.

我的错误在哪里?谢谢.

Tom*_*kis 5

基本上你需要做的是使用ViewModel Factory注入UserRepository到你的ViewModels构造函数,初始化它然后你就可以使用它.您不能使用字段或参数注入ViewModels.

我建议你遵循这篇文章:将新的ViewModel添加到你的MVVM中

它提供了足够的信息来开始使用Dagger 2和Architecture Components.


希望能帮助到你.