Нулевые объекты в viewmodel - PullRequest
0 голосов
/ 30 октября 2018

Я изучаю MVVM с привязкой данных, и у меня есть проблема с нулевыми объектами в моем TaskViewModel. Я создал два конструктора, и один из них пуст, но у меня нет значения в объекте Task. Когда у меня был только один конструктор в viewmodel, он сделал ошибку с экземпляром viewmodel. Что я делаю не так? Если вы хотите больше кода, пожалуйста, дайте мне знать.

TaskViewModel

public class TaskViewModel extends ViewModel {

private TaskRepository mTaskRepository;
private LiveData<List<Task>> taskMutableLiveData;
private String TAG = "TaskViewModel = ";
private Context context;

public final ObservableField<String> description = new ObservableField<>();
public final ObservableField<String> date = new ObservableField<>();
public final ObservableField<String> time = new ObservableField<>();


public TaskViewModel(TaskRepository taskRepository) {
  mTaskRepository = taskRepository;
}

public TaskViewModel() {
}

public void insert() {
    addTask(description.get(), date.get(), time.get());
    Log.d(TAG, "DATA " + description + " / " + date + " / " + time);
}

public void addTask(String description, String date, String time) {
    Task addTask = new Task(description, date, time);
    mTaskRepository.insert(addTask);
}
}

TaskRepository

public class TaskRepository {

private TaskDao taskDao;
private LiveData<List<Task>> allTasks;


public TaskRepository(Application application) {
    TaskDatabase database = TaskDatabase.getInstance(application);
    taskDao = database.taskDao();
    allTasks = taskDao.getAllTasks();
}

public void insert(Task task) {
    new InsertTaskAsyncTask(taskDao).execute(task);
}

public void update(Task task) {
    new UpdateTaskAsyncTask(taskDao).execute(task);
}

public void delete(Task task) {
    new DeleteTaskAsyncTask(taskDao).execute(task);
}

public LiveData<List<Task>> getAllTasks() {
    return allTasks;
}


private static class InsertTaskAsyncTask extends AsyncTask<Task, Void, Void> 
{
    private TaskDao taskDao;

    private InsertTaskAsyncTask(TaskDao taskDao) {
        this.taskDao = taskDao;
    }

    @Override
    protected Void doInBackground(Task... tasks) {
        taskDao.insert(tasks[0]);
        return null;
    }
}

private static class DeleteTaskAsyncTask extends AsyncTask<Task, Void, Void> 
{
    private TaskDao taskDao;

    private DeleteTaskAsyncTask(TaskDao taskDao) {
        this.taskDao = taskDao;
    }

    @Override
    protected Void doInBackground(Task... tasks) {
        taskDao.delete(tasks[0]);
        return null;
    }
}

private static class UpdateTaskAsyncTask extends AsyncTask<Task, Void, Void> 
{
    private TaskDao taskDao;

    private UpdateTaskAsyncTask(TaskDao taskDao) {
        this.taskDao = taskDao;
    }

    @Override
    protected Void doInBackground(Task... tasks) {
        taskDao.update(tasks[0]);
        return null;
    }
}

}

1 Ответ

0 голосов
/ 31 октября 2018

Вместо создания параметризованного конструктора для ViewModel выполните инициализацию в конструкторе по умолчанию. потому что, в конце концов, мы потребляем ViewModel из ViewModelProviders, у которого есть вызов конструктора по умолчанию (если вы еще не настроили его).

Так что, как показано ниже,

public class TaskViewModel extends ViewModel {

    private TaskRepository mTaskRepository;
    ...

    public TaskViewModel() {
        mTaskRepository = new TaskRepository(); // This will avoid your null pointer exception
    }

    public void insert() {
        addTask(description.get(), date.get(), time.get());
        Log.d(TAG, "DATA " + description + " / " + date + " / " + time);
    }

    public void addTask(String description, String date, String time) {
        Task addTask = new Task(description, date, time);
        mTaskRepository.insert(addTask);
    }
}

Если вы хотите иметь Context в вашем ViewModel, используйте вместо него AndroidViewModel, который предоставит вам контекст приложения в реализации конструктора по умолчанию. но не храните его в своем ViewModel.

...