Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
はじめての個人開発で、Jetpack Compose を使った話
Search
keigomichi
April 22, 2023
Technology
290
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
はじめての個人開発で、Jetpack Compose を使った話
第3回 iOS&Android学生エンジニアLT
https://sandbox-style.connpass.com/event/280469
keigomichi
April 22, 2023
More Decks by keigomichi
See All by keigomichi
技術書典 14 戦利品紹介
keigomichi
0
54
魔法のスプレッドシートの裏側
keigomichi
0
260
Thundercard - 名刺のようなSNSアプリ
keigomichi
0
87
QR I/O - 読み取りも、作成も。
keigomichi
0
110
Capture The Task - 写真を撮ってタスク管理
keigomichi
0
79
CouponRoll - 店舗アプリを気軽に導入
keigomichi
0
81
Other Decks in Technology
See All in Technology
自律型 AI をセキュアに実装!Gemini と MIG で作る動的コード実行環境
recruitengineers
PRO
1
240
ビジネスを止めない技術的負債の返済のための戦略とその手法 - 技術的負債と向き合う / Complexity and Simplicity
soudai
PRO
3
680
"優秀な誰か"の下位互換にならないために
yut0naga1_fa
0
1.2k
オブザーバビリティを高める AI エージェント体験を考える / Designing AI Agent Experiences That Enhance Observability
aoto
PRO
2
320
AIは爆速なのに、私が詰まっていた話 ― 音声入力と鳴くマスコットでボトルネックを削る
yama3133
0
580
Incremental HTTP
kazuho
5
2.1k
自作バイナリを動かす「入口」8選
puhitaku
1
1.2k
Datadog の学び方 - あるいは、オブザーバビリティを学ぶとは何か
mananyuki
1
520
全PRの83%が AIレビューだけでマージできるようになった開発組織は その後どうなったか @2026/10
athug
0
130
ハードウェアコンペでもAI駆動開発が進んでいる話
iotengineer22
1
660
分析AIエージェントを育てる、動く環境を育てる
codatum
1
720
V8のArray.prototype.flatを最大約20倍速くするまでと、巨大OSSへの大規模コミットの道のり
riyaamemiya
0
120
Featured
See All Featured
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
510
Building AI with AI
inesmontani
PRO
1
1.3k
First, design no harm
axbom
PRO
2
1.3k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Exploring anti-patterns in Rails
aemeredith
4
530
The Language of Interfaces
destraynor
162
27k
The Cost Of JavaScript in 2023
addyosmani
55
10k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
580
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
A Tale of Four Properties
chriscoyier
163
24k
Making the Leap to Tech Lead
cromwellryan
135
10k
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