java - Dagger 2 场注入(inject)在 Android 中不起作用

标签 java android dependency-injection dagger-2

问题是我尝试在 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:

应用在 ProfileViewModelinit() 方法中的 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/

相关文章:

java - 在 Mac OSX 上将 JDK 7 或更高版本与 Android Studio 和 Eclipse 结合使用

java - 在 JPA 中使用两个或多个参数的搜索查询

android - 为我的客户签署 APK 有风险吗?

android - ContextCompat.checkSelfPermission 的用例是什么?

asp.net - ASP.NET MVC 6 中 FilterAttribute 内的依赖注入(inject)

java - 将应用程序配置到 facebook 错误 : "App is misconfigured for Facebook login.."

java - Orika - 仅当第三个字段与字符串匹配时才映射两个字段

android - 检查输入时间在android中的两个时间范围之间

c# - MEF - 将默认创建策略更改为 NonShared

php - fatal error :registerContainerConfiguration 的声明必须与 Kernel::registerContainerConfiguration 的声明兼容