【问题标题】:How to pass a custom object from an activity class to a repository class using Dagger2?如何使用 Dagger2 将自定义对象从活动类传递到存储库类?
【发布时间】:2019-07-31 16:26:20
【问题描述】:

这就是我在 `MyActivity 类中观察数据的方式:

@Module
public class MyActivity extends DaggerAppCompatActivity {
    @Inject MyViewModelFactory factory;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addData();
    }

    public void addData() {
        //How to pass this custom object to ViewModel???
        CustomClass obj = new CustomClass("CustomData");
        MyViewModel viewModel = ViewModelProviders.of(this, factory).get(MyViewModel.class);
        LiveData<Data> liveData = viewModel.getLiveData();
        liveData.observe(this, this);
    }
}

这是我的ModelFactory 班级:

@Singleton
public class MyViewModelFactory implements ViewModelProvider.Factory {
    private final Map<Class<? extends ViewModel>, Provider<ViewModel>> creators;

    @Inject
    MyViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> creators) {
        this.creators = creators;
    }

    @NonNull
    @Override
    public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
        Provider<? extends ViewModel> creator = creators.get(modelClass);
        if (creator == null) {
            for (Map.Entry<Class<? extends ViewModel>, Provider<ViewModel>> entry : creators.entrySet()) {
                if (modelClass.isAssignableFrom(entry.getKey())) {
                    creator = entry.getValue();
                    break;
                }
            }
        }

        if (creator == null) {
            throw new IllegalArgumentException("unknown model class " + modelClass);
        }

        try {
            return (T) creator.get();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

这是我的ViewModel 课程:

public class MyViewModel extends ViewModel {
    private LiveData<Data> dataLiveData;
    private MyRepository repository;

    @Inject
    MyViewModel(MyRepository repository) {
        this.repository = repository;
        //I need it here!!!
        dataLiveData = repository.addDataToLiveData(obj);
    }

    LiveData<Data> getLiveData() {
        return dataLiveData;
    }
}

这是我的Repository 课程:

@Singleton
public class MyRepository {
    private MyApi myApi;

    @Inject
    MyRepository(MyApi myApi) {
        this.myApi = myApi;
    }

    LiveData<Data> addDataToLiveData(CustomClass obj) {
        myApi.getData(obj); //Make Api call and use obj
    }
}

如何将 CustomClass 对象从 MyActivity 传递给 ViewModel 类?

【问题讨论】:

  • 为什么不能直接在函数中传递呢?
  • 正如我对您的回答所评论的,始终是null

标签: android dependency-injection dagger-2 dagger android-viewmodel


【解决方案1】:

在 ViewModel 中创建一个接受您的 CustomClass 对象的函数,并从 Activity 调用该函数。

public class MyViewModel extends ViewModel {
    private LiveData<Data> dataLiveData;
    private MyRepository repository;


    @Inject
    MyViewModel(MyRepository repository) {
        this.repository = repository;
    }

    LiveData<Data> getLiveData() {
        return dataLiveData;
    }

    public void setCustomObject(CustomObject customObj){
       repository.addDataToLiveData(obj);

    }
}

编辑:修复您的错误:

 public void addData() {
        //How to pass this custom object to ViewModel???
        CustomClass obj = new CustomClass("CustomData");
        MyViewModel viewModel = ViewModelProviders.of(this, factory).get(MyViewModel.class);
        //ADD IT HERE
        viewModel.setCustomObj(obj);
        LiveData<Data> liveData = viewModel.getLiveData();
        liveData.observe(this, this);
    }

【讨论】:

  • 我已经这样做了,并在MyActivity 中调用setCustomObject(obj),但我总是在dataLiveData = repository.addDataToLiveData(obj); 行得到NullPointerException。所以objnull
  • @LilianSorlanski 因为你在构造函数中添加它,当构造函数被调用时,对象为空,而是将它添加到函数中的 livedata
  • @LilianSorlanski 从您的 addData 函数创建视图模型对象之后立即调用此函数。
  • 你是正确的救生员,完美运行!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多