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
200
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
170
コードレビューを支援するAI技術の応用
akkie76
5
450
オブジェクト指向コードレビューの新しいアプローチ
akkie76
3
6.3k
Jetpack Compose で Adaptive Layout に対応しよう
akkie76
0
110
Observationではじめる値監視
akkie76
3
1.8k
TextField 表示スタイル変更の 有効活用例 5 選
akkie76
0
300
M3 NavigationBar をマスターする
akkie76
0
480
アーキテクチャを明文化して臨んだ新規アプリ開発戦略
akkie76
0
140
プライバシー強化の最前線 ~2024年春以降の展望と対策~
akkie76
0
160
Other Decks in Technology
See All in Technology
R3のコードから見る実践LINQ実装最適化・コンカレントプログラミング実例
neuecc
3
3.3k
プロンプトエンジニアリングでがんばらない-Agentic Workflow へ-近藤憲児
kenjikondobai
6
1.3k
.NET Profiler in 2024.
kkamegawa
2
2.2k
Gradle Build Scanを使ってビルドのことを知ろう potatotips #87
tomorrowkey
2
160
MLOpsの「壁」を乗り越える、LINEヤフーの Data Quality as Code
lycorptech_jp
PRO
8
670
Cracking the KubeCon CfP
inductor
2
270
Microsoft Intune 勉強会 第 2 回目
tamaiyutaro
2
500
止まらないLinuxシステムを構築する_高信頼性クラスタ入門
koedoyoshida
3
2.3k
個人のAWSアカウントをマルチ運用してみた
miura55
2
240
チームでロジカルシンキングに改めて向き合っている話 〜学習環境と実践⽅法〜
sansantech
PRO
3
3.3k
web-application-security
matsuihidetoshi
1
200
BPStudyの200回を中心にIT業界を振り返る。そしてこれから
haru860
3
430
Featured
See All Featured
[RailsConf 2023] Rails as a piece of cake
palkan
28
4k
In The Pink: A Labor of Love
frogandcode
138
21k
Six Lessons from altMBA
skipperchong
22
3k
GitHub's CSS Performance
jonrohan
1025
450k
Practical Orchestrator
shlominoach
183
9.7k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
15
1.6k
What the flash - Photography Introduction
edds
64
11k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
501
140k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
221
21k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
8
3.4k
Scaling GitHub
holman
457
140k
Web development in the modern age
philhawksworth
203
10k
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 🎉