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
590
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
Graph Art with Charts API – Beyond Data Visualization
akkie76
0
160
Meet the Translation API
akkie76
0
400
コードレビューで開発を加速させるAIコードレビュー
akkie76
1
640
Android Target SDK 35 (Android 15) 対応の概要
akkie76
0
5.9k
コードレビューを支援するAI技術の応用
akkie76
5
1.2k
オブジェクト指向コードレビューの新しいアプローチ
akkie76
3
9.1k
Jetpack Compose で Adaptive Layout に対応しよう
akkie76
0
970
Observationではじめる値監視
akkie76
4
4.7k
TextField 表示スタイル変更の 有効活用例 5 選
akkie76
0
710
Other Decks in Technology
See All in Technology
コスト削減の基本の「キ」~ コスト消費3大リソースへの対策 ~
smt7174
2
320
大「個人開発サービス」時代に僕たちはどう生きるか
sotarok
5
1.6k
Snowflakeの生成AI機能を活用したデータ分析アプリの作成 〜Cortex AnalystとCortex Searchの活用とStreamlitアプリでの利用〜
nayuts
0
140
Function Body Macros で、SwiftUI の View に Accessibility Identifier を自動付与する/Function Body Macros: Autogenerate accessibility identifiers for SwiftUI Views
miichan
2
150
「魔法少女まどか☆マギカ Magia Exedra」の必殺技演出を徹底解剖! -キャラクターの魅力を最大限にファンに届けるためのこだわり-
gree_tech
PRO
0
430
実践データベース設計 ①データベース設計概論
recruitengineers
PRO
4
2k
見てわかるテスト駆動開発
recruitengineers
PRO
6
2.4k
Figma + Storybook + PlaywrightのMCPを使ったフロントエンド開発
yug1224
10
3.6k
まだ間に合う! StrandsとBedrock AgentCoreでAIエージェント構築に入門しよう
minorun365
PRO
11
720
「魔法少女まどか☆マギカ Magia Exedra」のグローバル展開を支える、開発チームと翻訳チームの「意識しない協創」を実現するローカライズシステム
gree_tech
PRO
0
430
なぜスクラムはこうなったのか?歴史が教えてくれたこと/Shall we explore the roots of Scrum
sanogemaru
0
110
スプリントレトロスペクティブはチーム観察の宝庫? 〜チームの衝突レベルに合わせたアプローチ仮説!〜
electricsatie
1
150
Featured
See All Featured
Music & Morning Musume
bryan
46
6.8k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.8k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
The Art of Programming - Codeland 2020
erikaheidi
55
13k
The Pragmatic Product Professional
lauravandoore
36
6.8k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
jQuery: Nuts, Bolts and Bling
dougneiner
64
7.9k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.8k
4 Signs Your Business is Dying
shpigford
184
22k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.4k
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 🎉