Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
はじめての個人開発で、Jetpack Compose を使った話
Search
keigomichi
April 22, 2023
Technology
0
260
はじめての個人開発で、Jetpack Compose を使った話
第3回 iOS&Android学生エンジニアLT
https://sandbox-style.connpass.com/event/280469
keigomichi
April 22, 2023
Tweet
Share
More Decks by keigomichi
See All by keigomichi
技術書典 14 戦利品紹介
keigomichi
0
40
魔法のスプレッドシートの裏側
keigomichi
0
110
Thundercard - 名刺のようなSNSアプリ
keigomichi
0
74
QR I/O - 読み取りも、作成も。
keigomichi
0
86
Capture The Task - 写真を撮ってタスク管理
keigomichi
0
63
CouponRoll - 店舗アプリを気軽に導入
keigomichi
0
69
Other Decks in Technology
See All in Technology
DEFCON CHV CTF 2025 Write-up
bata_24
0
160
Flaky Testへの現実解をGoのプロポーザルから考える | Go Conference 2025
upamune
1
190
"複雑なデータ処理 × 静的サイト" を両立させる、楽をするRails運用 / A low-effort Rails workflow that combines “Complex Data Processing × Static Sites”
hogelog
3
1.1k
全てGoで作るP2P対戦ゲーム入門
ponyo877
3
960
Go Conference 2025: GoのinterfaceとGenericsの内部構造と進化 / Go type system internals
ryokotmng
3
370
KAGのLT会 #8 - 東京リージョンでGAしたAmazon Q in QuickSightを使って、報告用の資料を作ってみた
0air
0
150
【新卒研修資料】LLM・生成AI研修 / Large Language Model・Generative AI
brainpadpr
11
3.5k
High performance GIF playback/iOSDC25
noppefoxwolf
1
140
それでも私はContextに値を詰めたい | Go Conference 2025 / go conference 2025 fill context
budougumi0617
4
710
ブラウザのAPIで色々なデバイスをあれこれ扱ってみた話(主にWeb HID API) / IoTLT @JLCPCB オープンハードカンファレンス
you
PRO
0
120
Deep Research と NotebookLM を使い倒す!レガシーリプレイスの技術選定と学習コスト削減術
tet0h
0
2k
AWSのProductのLifecycleについて
stknohg
PRO
0
240
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.4k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.7k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Docker and Python
trallard
46
3.6k
Testing 201, or: Great Expectations
jmmastey
45
7.7k
How STYLIGHT went responsive
nonsquared
100
5.8k
Done Done
chrislema
185
16k
GitHub's CSS Performance
jonrohan
1032
460k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
880
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Scaling GitHub
holman
463
140k
Transcript
はじめての個人開発で、 Jetpack Compose を使った話 第 3 回 iOS & Android
学生エンジニア LT 2023/04/22 @keigomichi 1
TOC 自己紹介 春インターンに参加 Jetpack Compose どうして Compose を使ったの? Compose 導入で使ったライブラリ等
まとめ 2
自己紹介 はじめまして、keigomichi です 広島大学情報科学部情報科学科 B3 Web フロントエンド・Flutter・Kotlin インターンやハッカソンに出没 趣味は、のりもの ・おいしい食事
3
春インターンに参加 Android 向け育成型インターンに参加しました。 4
Android 向け育成型インターン 2 週間で、「1 人でアプリを開発しリリースできるようになる」ことが目標 プロフィール交換アプリを個人で開発 メンター社員の方に質問し放題 5
完成したアプリ 6
Jetpack Compose Compose を使用しました。 7
どうして Compose を使ったの? React や Flutter を使用していたので、宣言的 UI に慣れていた 主に
Kotlin だけで開発を進めることができ、コード削減 プレビュー機能が充実 "Recommendations for Android architecture" でも Recommended に 8
Compose 導入で使ったライブラリ等 Compose Destinations Showkase Accompanist androidx.compose.ui.viewinterop 9
Compose Destinations Navigation Compose だと面倒な画面遷移の実装をシンプルに 型安全な引数 KSP によるコード生成 10
基本的な用法 画面 Composable に @Destination アノテーションをつける @RootNavGraph(start = true) @Destination
@Composable fun HomeScreen( navigator: DestinationsNavigator, ) { // ... } 11
基本的な用法 "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
基本的な用法 "build/generated/ksp/debug/kotlin/" 以下にビルドされる DestinationNavHost.kt public object NavGraphs { public val
root: NavGraph = NavGraph( route = "root", startRoute = HomeScreenDestination, destinations = listOf( HomeScreenDestination, ) ) } 13
基本的な用法 生成された Destination オブジェクトを使って画面遷移 @RootNavGraph @Destination @Composable fun ProfileDetailScreen( navigator:
DestinationsNavigator ) { navigator.navigate(HomeScreenDestination) } DestinationsNavHost を呼び出す DestinationsNavHost(navGraph = NavGraphs.root) 14
引数を渡す(画面 Composable 内で引数を使用する場合) Composable 関数に引数を追加する @RootNavGraph @Destination @Composable fun ProfileDetailScreen(
id: int ) { // ... } 15
引数を渡す(ViewModel で引数を使用する場合) 引数の data class を定義し、 @Destination に設定 data class
ProfileDetailScreenNavArgs( val id: int, ) @RootNavGraph @Destination(navArgsDelegate = ProfileDetailScreenNavArgs::class) @Composable fun ProfileDetailScreen( navigator: DestinationsNavigator, profileDetailViewModel: ProfileDetailViewModel = hiltViewModel(), ) { // ... } 16
引数を渡す(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
引数を渡す(ViewModel で引数を使用する場合) ViewModel で SavedStateHandle から引数を取得する @HiltViewModel class ProfileDetailViewModel @Inject
constructor( savedStateHandle: SavedStateHandle, ) : ViewModel() { val navArgs: ProfileDetailScreenNavArgs = ProfileDetailScreenDestination.argsFrom(savedStateHandle) // OR val navArgs: ProfileDetailScreenNavArgs = savedStateHandle.navArgs() } 18
引数を渡す(ViewModel で引数を使用する場合) SavedStateHandle.navArgs() は… NavArgsGetters.kt public inline fun <reified T>
SavedStateHandle.navArgs(): T { return navArgs(T::class.java, this) } 19
その他 ディープリンク Navigation Bar との統合 アニメーション Wear OS のサポートもあるらしい 20
Showkase UI 要素のカタログを 1 つの Activity で生成 @Preview アノテーションをつけるだけ Paparazzi
等々と組み合わせて VRT も可能 (らしい) 21
Accompanist Compose でまだ提供されていない便利な API を提供 e.g. Status Bar, Navigation Bar
/ WebView / Permission androidx.compose.ui.viewinterop AndroidView コンポーザブルを使って、Compose 内で view 要素を扱える 22
まとめ Compose を使ってアプリを作りました Annotation processing library が便利 Compose Destinations -
画面遷移をシンプル・安全に実装できる Showkase - UI カタログを簡単に作れる・VRT にも使える 拡張ライブラリーや相互運用のための API も 23
ご清聴ありがとうございました 👋 24