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
rememberUpdatedState の使いどころを考える
Search
akkiee76
November 12, 2023
Technology
0
210
rememberUpdatedState の使いどころを考える
「potatotips #85 iOS/Android開発Tips共有会」で発表したスライドになります。
https://potatotips.connpass.com/event/299247/
akkiee76
November 12, 2023
Tweet
Share
More Decks by akkiee76
See All by akkiee76
Android Target SDK 35 (Android 15) 対応の概要
akkie76
0
240
コードレビューを支援するAI技術の応用
akkie76
5
480
オブジェクト指向コードレビューの新しいアプローチ
akkie76
3
6.5k
Jetpack Compose で Adaptive Layout に対応しよう
akkie76
0
140
Observationではじめる値監視
akkie76
3
2k
TextField 表示スタイル変更の 有効活用例 5 選
akkie76
0
320
M3 NavigationBar をマスターする
akkie76
0
510
アーキテクチャを明文化して臨んだ新規アプリ開発戦略
akkie76
0
140
プライバシー強化の最前線 ~2024年春以降の展望と対策~
akkie76
0
160
Other Decks in Technology
See All in Technology
Kaggleで学ぶ系列データのための深層学習モデリング
yu4u
7
1.7k
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
5
38k
OPENLOGI Company Profile for engineer
hr01
1
2.2k
PHP 9 に備えよ - 動的プロパティ、どうすればいぃ?
taisukearase
0
380
汎用ポリシー言語Rego + OPAと認可・検証事例の紹介 / Introduction Rego & OPA for authorization and validation
mizutani
1
180
RailsConf 2024 Keynote "Startups on Rails in 2024"
irinanazarova
0
830
開発スピードの維持向上を支える、テスト設計の 漸進的進化への取り組み / Continuous Test Design Development for Speed of Product Development
ropqa
0
190
日本が誇るイタリアのダンスミュージック!? ユーロビートって何??
minorun365
PRO
2
230
QA経験のないエンジニアリング マネージャーがQAのカジュアル面談に出て 苦労していること・気づいたこと / scrum fest niigata 2024
yoshikiiida
2
680
複雑なビジネスルールに挑む:正確性と効率性を両立するfp-tsのチーム活用術 / Strike a balance between correctness and efficiency with fp-ts
kakehashi
5
3.7k
生成AIがもたらす変革 / GitHubGalaxy_CyberAgent
cyberagentdevelopers
PRO
2
170
Deno で作る快適な “as Code” プラットフォーム – TSKaigi 2024
pizzacat83
4
320
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
23
1.7k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
9
1.3k
What the flash - Photography Introduction
edds
64
11k
The World Runs on Bad Software
bkeepers
PRO
61
6.8k
Web development in the modern age
philhawksworth
203
10k
It's Worth the Effort
3n
180
27k
Building Applications with DynamoDB
mza
88
5.7k
Embracing the Ebb and Flow
colly
80
4.2k
The Pragmatic Product Professional
lauravandoore
26
5.9k
Faster Mobile Websites
deanohume
300
30k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
155
14k
Building Effective Engineering Teams - LeadDev
addyosmani
33
1.9k
Transcript
©2023 RAKUS Co., Ltd. rememberUpdatedState の使いどころを考える potatotips #85 iOS/Android開発Tips共有会 2023/11/14
@akkiee76
自己紹介 • Akihiko Sato • Rakus Inc. • 楽楽精算 •
@akkiee76 / X
rememberUpdatedState とは?
Compose における Side effect APIs の1つ
Compose 可能な関数の範囲外で発生するアプリの状態の変化 • 予想しない再コンポジション • 異なる順序でのコンポーザブルの再コンポジション • 破棄可能な再コンポジション Compose における
Side effect(副作用)とは? コンポーザブルは Side effect がないようにするのが理想的 https://developer.android.com/jetpack/compose/side-effects
• スナックバーを表示する • 1 回限りのイベントをトリガーする • 特定の状態で別の画面に遷移する Side effect が必要なケース
https://developer.android.com/jetpack/compose/side-effects 予測可能な方法で Side effect を実行する必要がある
rememberUpdatedState API とは? 値が変化しても再起動すべきでない作用を 参照することができる Side effect API https://developer.android.com/jetpack/compose/side-effects?hl=jp#rememberupdatedstate 再起動が高コストである作用にアプローチができる
最新の時刻を Snackbar に表示するユースケース 1. remember を利用した場合 2. LaunchedEffect のキーを更新した場合 3.
rememberUpdatedState API を利用した場合
1. remember を利用した場合
var currentTime by remember { mutableStateOf(Date().time.toString()) } Button( onClick =
{ currentTime = Date().time.toString() } ) { Text(currentTime) } SnackbarScreen ( currentTime = currentTime, snackbarHostState = snackbarHostState ) 時刻を保持 時刻を更新 時刻を渡す
@Composable fun SnackbarScreen( currentTime: String, snackbarHostState: SnackbarHostState ) { LaunchedEffect(Unit)
{ delay(3000) snackbarHostState.showSnackbar(message = currentTime) } } 一度だけ実行
2. LaunchedEffect の key を更新した場合
@Composable fun SnackbarScreen( currentTime: String, snackbarHostState: SnackbarHostState ) { LaunchedEffect(currentTime)
{ delay(3000) snackbarHostState.showSnackbar(message = currentTime) } } 何も表示されない LaunchedEffect が再起動し Coroutine がキャンセル currentTimeが更新され続ける
3. rememberUpdatedState API を利用した場合
@Composable fun SnackbarScreen ( currentTime: String, snackbarHostState : SnackbarHostState )
{ val rememberTime by rememberUpdatedState (newValue = currentTime) LaunchedEffect (Unit) { delay(3000) snackbarHostState .showSnackbar( message = rememberTime) } } 最新の値が表示 値が変化しても LaunchedEffect の Coroutine はキャンセルされない currentTimeが更新され続ける
@Composable fun <T> rememberUpdatedState(newValue: T): State<T> = remember { mutableStateOf(newValue)
}.apply { value = newValue } オブジェクトをキャプチャーし、中身を更新している
まとめ rememberUpdatedState API の使いどころ • Coroutine の処理をキャンセルさせたくないケース ◦ 重い通信処理(ファイルダウンロード)など •
コールバックを利用するケース ◦ エラーハンドリングなど • 異なる Composable などで変更される値を参照するケース
Thank you 🎉