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 } } }
今日はここまで。