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
akkie76
November 12, 2023
Technology
0
190
rememberUpdatedState の使いどころを考える
「potatotips #85 iOS/Android開発Tips共有会」で発表したスライドになります。
https://potatotips.connpass.com/event/299247/
akkie76
November 12, 2023
Tweet
Share
More Decks by akkie76
See All by akkie76
Android Target SDK 35 (Android 15) 対応の概要
akkie76
0
110
オブジェクト指向コードレビューの新しいアプローチ
akkie76
3
6.2k
Jetpack Compose で Adaptive Layout に対応しよう
akkie76
0
95
Observationではじめる値監視
akkie76
3
1.6k
TextField 表示スタイル変更の 有効活用例 5 選
akkie76
0
300
M3 NavigationBar をマスターする
akkie76
0
470
アーキテクチャを明文化して臨んだ新規アプリ開発戦略
akkie76
0
140
プライバシー強化の最前線 ~2024年春以降の展望と対策~
akkie76
0
150
OSSライブラリの呪縛と解放戦略
akkie76
1
650
Other Decks in Technology
See All in Technology
LangSmith入門―トレース/評価/プロンプト管理などを担うLLMアプリ開発プラットフォーム
os1ma
3
410
私が trocco を推す理由
__allllllllez__
1
260
いつか使うかも貯金してたらめちゃめちゃ機能が増えてた話
riyaamemiya
0
420
require(ESM)とECMAScript仕様
uhyo
3
830
JAWS-UG Bedrock Claude Night
yamahiro
3
620
障害対応をちょっとずつよくしていくための 演習の作りかた
heleeen
0
310
VSCodeの拡張機能を作っている話
ebarakazuhiro
1
640
GraphQL 成熟度モデルの紹介と、プロダクトに当てはめた事例 / GraphQL maturity model
mh4gf
7
1.4k
ServiceNow Knowledge 24の歩き方 EYストラテジー・アンド・コンサルティング
manarobot
0
200
JSON攻略法.pdf
miyakemito
8
5.1k
TechFeed Experts Night#27 〜 フロントエンドフレームワーク最前線 (Svelte)
baseballyama
1
540
MixIT 2024 - Pulumi : Gérer son infra avec son langage de programmation préféré
ju_hnny5
0
100
Featured
See All Featured
Java REST API Framework Comparison - PWX 2021
mraible
PRO
18
6.9k
The Mythical Team-Month
searls
216
42k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
40
4.4k
Building Applications with DynamoDB
mza
88
5.6k
Product Roadmaps are Hard
iamctodd
44
9.7k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
322
20k
KATA
mclloyd
15
12k
How to Ace a Technical Interview
jacobian
272
22k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
241
1.2M
Rebuilding a faster, lazier Slack
samanthasiow
73
8.2k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
2
1.3k
Design by the Numbers
sachag
274
18k
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 🎉