Mokelab Blog

#70 Jetpack ComposeでToDoアプリを作る - ScaffoldとTopAppBar

HiltとViewModelの準備ができたので、ようやく各画面の実装に入れます。

Scaffold

Scaffoldはアプリのベースとなるものを提供してくれるComposableです。画面にTopAppBarを表示したり、下ナビゲーションを表示したりする際には使うとよいでしょう。

今回は起動直後の画面に追加してみます。

@Composable
fun MainScreen(
  navController: NavController,
  viewModel: MainViewModel,
) {
  Scaffold(
    topBar = { MainTopBar() },
    floatingActionButton = { MainFAB(navController) }
  ) {
    // ToDoのリスト表示をここに書く
  }
}

起動直後の画面ではTopBarとFABを表示したいので、Scaffoldの該当パラメータでComposableを指定します。

MainToolBarはTopAppBarを表示するのみです。タイトルとしてアプリ名を表示してみます。

@Composable
fun MainTopBar() {
  TopAppBar(
    title = {
      Text(stringResource(id = R.string.app_name))
    },
  )
}

MainFABはFloatingActionButtonを表示するのみです。FAB内のアイコンはIconを使うとリソースを追加せずに済みます。

@Composable
fun MainFAB(navController: NavController) {
  FloatingActionButton(onClick = {
    // 作成画面へ画面遷移
    navController.navigate("create")
  }) {
    Icon(Icons.Filled.Add, "Add")
  }
}

FABがタップされたらToDo作成画面に遷移させたいので、onClick()内でNavControllernavigate()を呼びます。引数には遷移先となるルート名を指定します。

実行してみる

ここまで作成したらエミュレーター/実機で実行してみます。

ビルドは通るのですが、実行しようとすると落ちます。Logcatを見てみます(適度に改行をいれています)。

java.lang.RuntimeException: Unable to instantiate application com.mokelab.compose.todo.ToDoApplication
  package com.mokelab.compose.todo: java.lang.ClassNotFoundException: Didn't find class 
  "com.mokelab.compose.todo.ToDoApplication" on path: DexPathList[[zip file
  "/data/app/~~kRtLL5Kf7flCSsYo5QMvWg==/com.mokelab.compose.todo-UIxaqvhfTaNcTxy4_gxxdw==/base.apk"],
  nativeLibraryDirectories=[/data/app/~~kRtLL5Kf7flCSsYo5QMvWg==/
  com.mokelab.compose.todo-UIxaqvhfTaNcTxy4_gxxdw==/lib/x86_64, /system/lib64, /system_ext/lib64]]

どうもHiltがKSPに対応していないのが原因のようです。すいません。。。

仕方ないのでkaptをapp/build.gradleに追加します。

plugins {
  ...
  id 'dagger.hilt.android.plugin'
  // kaptを追加
  id 'kotlin-kapt'
}

そしてHiltでKSPを使っていた箇所をkaptにします。

dependencies {
  ...
  implementation "com.google.dagger:hilt-android:2.36"
  // 仕方ないのでkaptにする
  kapt "com.google.dagger:hilt-android-compiler:2.36"
  implementation 'androidx.hilt:hilt-navigation-compose:1.0.0-alpha03'
}

ビルドして実行すると、最初の画面が表示されました。右下のFABをタップすると真っ白な作成画面に遷移します。

ここまで作業したものはこちらにあります。

本サイトではサービス向上のため、Google Analyticsを導入しています。分析にはCookieを利用しています。