Upgrade to Pro — share decks privately, control downloads, hide ads and more …

はじめての個人開発で、Jetpack Compose を使った話

はじめての個人開発で、Jetpack Compose を使った話

第3回 iOS&Android学生エンジニアLT
https://sandbox-style.connpass.com/event/280469

Avatar for keigomichi

keigomichi

April 22, 2023
Tweet

More Decks by keigomichi

Other Decks in Technology

Transcript

  1. どうして Compose を使ったの? React や Flutter を使用していたので、宣言的 UI に慣れていた 主に

    Kotlin だけで開発を進めることができ、コード削減 プレビュー機能が充実 "Recommendations for Android architecture" でも Recommended に 8
  2. 基本的な用法 "build/generated/ksp/debug/kotlin/" 以下にビルドされる HomeScreenDestination.kt public object HomeScreenDestination : DirectionDestination {

    public operator fun invoke(): Direction = this @get:RestrictTo(RestrictTo.Scope.SUBCLASSES) override val baseRoute: String = "home_screen" override val route: String = baseRoute // ... } 12
  3. 基本的な用法 "build/generated/ksp/debug/kotlin/" 以下にビルドされる DestinationNavHost.kt public object NavGraphs { public val

    root: NavGraph = NavGraph( route = "root", startRoute = HomeScreenDestination, destinations = listOf( HomeScreenDestination, ) ) } 13
  4. 基本的な用法 生成された Destination オブジェクトを使って画面遷移 @RootNavGraph @Destination @Composable fun ProfileDetailScreen( navigator:

    DestinationsNavigator ) { navigator.navigate(HomeScreenDestination) } DestinationsNavHost を呼び出す DestinationsNavHost(navGraph = NavGraphs.root) 14
  5. 引数を渡す(ViewModel で引数を使用する場合) 引数の data class を定義し、 @Destination に設定 data class

    ProfileDetailScreenNavArgs( val id: int, ) @RootNavGraph @Destination(navArgsDelegate = ProfileDetailScreenNavArgs::class) @Composable fun ProfileDetailScreen( navigator: DestinationsNavigator, profileDetailViewModel: ProfileDetailViewModel = hiltViewModel(), ) { // ... } 16
  6. 引数を渡す(ViewModel で引数を使用する場合) "build/generated/ksp/debug/kotlin/" 以下にビルドされる ProfileDetailScreenDestination.kt public object ProfileDetailScreenDestination : TypedDestination<ProfileDetailScreenNavArgs>

    { @get:RestrictTo(RestrictTo.Scope.SUBCLASSES) override val baseRoute: String = "profile_detail_screen" override val route: String = "$baseRoute/{id}" // ... override fun argsFrom(savedStateHandle: SavedStateHandle): ProfileDetailScreenNavArgs { return ProfileDetailScreenNavArgs( id = uUIDNavType.get(savedStateHandle, "id") ?: throw RuntimeException("'id' argument is mandatory, but was not present!"), ) } } 17
  7. 引数を渡す(ViewModel で引数を使用する場合) ViewModel で SavedStateHandle から引数を取得する @HiltViewModel class ProfileDetailViewModel @Inject

    constructor( savedStateHandle: SavedStateHandle, ) : ViewModel() { val navArgs: ProfileDetailScreenNavArgs = ProfileDetailScreenDestination.argsFrom(savedStateHandle) // OR val navArgs: ProfileDetailScreenNavArgs = savedStateHandle.navArgs() } 18
  8. Accompanist Compose でまだ提供されていない便利な API を提供 e.g. Status Bar, Navigation Bar

    / WebView / Permission androidx.compose.ui.viewinterop AndroidView コンポーザブルを使って、Compose 内で view 要素を扱える 22
  9. まとめ Compose を使ってアプリを作りました Annotation processing library が便利 Compose Destinations -

    画面遷移をシンプル・安全に実装できる Showkase - UI カタログを簡単に作れる・VRT にも使える 拡張ライブラリーや相互運用のための API も 23