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
41
魔法のスプレッドシートの裏側
keigomichi
0
140
Thundercard - 名刺のようなSNSアプリ
keigomichi
0
76
QR I/O - 読み取りも、作成も。
keigomichi
0
92
Capture The Task - 写真を撮ってタスク管理
keigomichi
0
65
CouponRoll - 店舗アプリを気軽に導入
keigomichi
0
70
Other Decks in Technology
See All in Technology
スクラムマスターが スクラムチームに入って取り組む5つのこと - スクラムガイドには書いてないけど入った当初から取り組んでおきたい大切なこと -
scrummasudar
1
1.3k
AWS re:Invent 2025 を振り返る
kazzpapa3
2
110
研究開発部メンバーの働き⽅ / Sansan R&D Profile
sansan33
PRO
4
21k
Claude Codeを使った情報整理術
knishioka
19
12k
製造業から学んだ「本質を守り現場に合わせるアジャイル実践」
kamitokusari
0
260
First-Principles-of-Scrum
hiranabe
2
1.1k
Cloud WAN MCP Serverから考える新しいネットワーク運用 / 20251228 Masaki Okuda
shift_evolve
PRO
0
130
[Data & AI Summit '25 Fall] AIでデータ活用を進化させる!Google Cloudで作るデータ活用の未来
kirimaru
0
4.2k
AI with TiDD
shiraji
1
340
「リリースファースト」の実感を届けるには 〜停滞するチームに変化を起こすアプローチ〜 #RSGT2026
kintotechdev
0
530
産業的変化も組織的変化も乗り越えられるチームへの成長 〜チームの変化から見出す明るい未来〜
kakehashi
PRO
1
270
AI との良い付き合い方を僕らは誰も知らない (WSS 2026 静岡版)
asei
1
220
Featured
See All Featured
The #1 spot is gone: here's how to win anyway
tamaranovitovic
1
880
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
0
170
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
130
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
160
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
97
How STYLIGHT went responsive
nonsquared
100
6k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
72
Agile that works and the tools we love
rasmusluckow
331
21k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
120
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.8k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
0
2.3k
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