🧑🏻💻 LocalClipboard と suspend 関数の組み合わせ
Compose 1.7 以降では、従来の ClipboardManager が非推奨になり、代わりに LocalClipboard + 非同期コピー が公式に推奨されています。
以下はシンプルなサンプルです。rememberCoroutineScope を使い、クリックイベントで非同期コピーを行っています。
val clipboard = LocalClipboard.current
val scope = rememberCoroutineScope()
Box(modifier = Modifier.clickable {
scope.launch {
val clipData = ClipData.newPlainText(uuid, uuid)
clipboard.setClipEntry(clipData.toClipEntry())
}
})
👉 Jason Ernst: Android ClipboardManager Deprecated: How to fix
🧑🏻💻 ViewModel 側でコピー処理をまとめる
世界的に著名な Android 開発者 Chris Banes や Jake Wharton のサンプルコードでは、UI 層から直接 Clipboard を操作せず、ViewModel に処理をまとめる パターンが多く見られます。
このアプローチを取ることで、UI の再コンポーズと Clipboard 操作が分離でき、よりテストしやすい設計になります。
class NoteViewModel : ViewModel() {
fun copyToClipboard(clipboard: Clipboard, text: String) {
viewModelScope.launch {
clipboard.setText(text)
}
}
}
UI 側では以下のように呼び出せます:
IconButton(onClick = { viewModel.copyToClipboard(clipboard, noteText) }) {
Icon(Icons.Default.ContentCopy, contentDescription = null)
}
Clipboard 拡張関数を定義しておくと便利です。
suspend fun Clipboard.setText(text: String) {
val clipData = ClipData.newPlainText(text, text).toClipEntry()
setClipEntry(clipData)
}
🧑🏻💻 まとめ
ClipboardManager は非推奨 → LocalClipboard + suspend が公式推奨。
UI 層はイベントを投げるだけ、コピー処理は ViewModel で完結。
Coroutine scope を ViewModel 内で扱うことで UI の再コンポーズに影響しない。
拡張関数で共通処理化すれば再利用性が高まる。
つまり、
「UI はシンプルに」「コピー処理は ViewModel に集約」
これが現代的な Compose + Clipboard のベストプラクティスです。
関連ワード: Android・AndroidStudio・IDEA・JetBrains・JetpackCompose・Kotlin・アプリ・ツール・ライブラリ・今さら聞けない・初心者・開発