TRY ANDROID DEV

Android アプリ開発のコーディングネタ。あとエンジニアとしての活動

GW:全力でTODOアプリを作ってみる(3日目)

背景

  • GWなのでアウトプットに専念してみる
  • 一旦基本のTODOアプリを作ったらどんな風になるのか試してみる
  • 子供が寝た隙に毎日1時間程度の稼働でどこまでいけるか
  • 子供が高熱を出して早速3日ストップした。。。

Repositoryを用意する

直接Daoを操作するのは忍びないというか、今後サーバ連携を考えるとRepositoryを経由させておきたい。

class TodoRepository(private val todoDao: TodoDao) {

    fun fetch() : LiveData<List<TodoEntity>>{
        return todoDao.getAllWords()
    }

    fun add(todoEntity: TodoEntity) {
        todoDao.insert(todoEntity)
    }
}

現状Entityをそのまま返却しているが、できればドメインモデルに変換して返したい。これはあとで対応する。

ViewModelにつなぐ

AACのViewModelを作成して、Repositoryを持たせる。

class TodoListViewModel(repository: TodoRepository) : ViewModel() {

    val todoList = repository.fetch()

    class Factory(private val todoRepository: TodoRepository) : ViewModelProvider.NewInstanceFactory() {
        override fun <T : ViewModel> create(modelClass: Class<T>): T {
            return TodoListViewModel(todoRepository) as T
        }
    }
}

一応RepositoryはFragmentからDIするようにした。

class TodoListFragment : Fragment() {

    lateinit var todoListViewModel: TodoListViewModel

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_todolist, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        todoListViewModel = ViewModelProviders.of(
            this,
            TodoListViewModel.Factory(TodoRepository(TodoDatabase.getDatabase(activity!!.application).todoDao()))
        )
            .get(TodoListViewModel::class.java)

        todoListViewModel.todoList.observe(this, Observer<List<TodoEntity>> {
            // TODO : ここでRecyclerViewに表示する?Bindしても良いかも。
        })
    }
}

ドメインモデルを作成する

やっぱりモデルを先に作っておこうと思った。

data class Task(val title: String,
                val detail: String,
                val expireTime: String)

ViewModelにクリック時の処理を追加

coroutineを利用して非同期処理実施。 viewmodel-ktx 2.1.0で追加されたviewModelScopeを利用すればjobを作らなくて済む。 (現時点でalpha04)

class AddTodoViewModel(private val todoRepository: TodoRepository) : ViewModel() {

    fun onClickSaveButton(title: String, detail: String, date: String) = runBlocking {
        viewModelScope.launch {
            val task = Task(title, detail, date)
            todoRepository.add(task)
        }
    }

    class Factory(private val todoRepository: TodoRepository) : ViewModelProvider.NewInstanceFactory() {
        override fun <T : ViewModel> create(modelClass: Class<T>): T {
            return AddTodoViewModel(todoRepository) as T
        }
    }
}

今日はここまで。