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
93
Capture The Task - 写真を撮ってタスク管理
keigomichi
0
65
CouponRoll - 店舗アプリを気軽に導入
keigomichi
0
70
Other Decks in Technology
See All in Technology
BidiAgent と Nova 2 Sonic から考える音声 AI について
yama3133
2
140
国井さんにPurview の話を聞く会
sophiakunii
1
320
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
2.9k
2025年の医用画像AI/AI×medical_imaging_in_2025_generated_by_AI
tdys13
0
300
モノタロウ x クリエーションラインで実現する チームトポロジーにおける プラットフォームチーム・ ストリームアラインドチームの 効果的なコラボレーション
creationline
0
400
2025-12-27 Claude CodeでPRレビュー対応を効率化する@機械学習社会実装勉強会第54回
nakamasato
4
1.4k
ハッカソンから社内プロダクトへ AIエージェント ko☆shi 開発で学んだ4つの重要要素
leveragestech
0
560
投資戦略を量産せよ 2 - マケデコセミナー(2025/12/26)
gamella
1
610
自己管理型チームと個人のセルフマネジメント 〜モチベーション編〜
kakehashi
PRO
5
1.9k
202512_AIoT.pdf
iotcomjpadmin
0
180
AI駆動開発ライフサイクル(AI-DLC)の始め方
ryansbcho79
0
290
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
12k
Featured
See All Featured
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
410
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.9k
The Curse of the Amulet
leimatthew05
0
6.8k
How Software Deployment tools have changed in the past 20 years
geshan
0
31k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Git: the NoSQL Database
bkeepers
PRO
432
66k
We Are The Robots
honzajavorek
0
130
Navigating Team Friction
lara
191
16k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
196
71k
How GitHub (no longer) Works
holman
316
140k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
0
1.8k
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