💨

JetpackCompose TextFieldにコピペしようとしてもできなくなるバグ

2022/11/16に公開

環境

composeVersion = 1.3.0

何が起きたか

タイトル通りではあるのですが、

TextFieldに一度ペーストした後

再度コピペしようとしても全く反応しなくなって

コピペができなくなるというバグがありました。

https://issuetracker.google.com/issues/243904929?pli=1

こちらのissueでも似たような症状が上がっていて、

これはどうしようもないものなのかと思っていたのですが、

コピペできる画面とできない画面の両方が存在したので

何かが違うと思い調査してみました。


しかし、

コードの見た目はほぼ同じでどうしたもんかとなってました.......

結論

TextFiledに渡す値は生の型以外の場合

@Stableをつけないとコピペできなくなるということがわかりました。

解説

解説というほどでもないのですが、

コピペできる画面とできない画面での違いをよく見てみると

TextFieldに渡している値が

data class経由で渡しているものと

interfaceを渡しているものの二種類があり、

interfaceの方には@Stableが付いていなかったので

もしやと思って試した結果判明した形になります。

@Stable
data class Hoge(
  val textFieldEntity: TextFieldEntity
)

interface TextFieldEntity {
  fugafuga.......
}

// みたいな感じ


一応念のために全てに@Stableもしくは@Immutableを付けることで対応しましたが

よく考えるとCompose側が直接参照するガワにだけアノテーションがあれば

あとは良しなにしてくれるような気がしています。

理由としては@Stableを持ったdata classの先の値は

アノテーションを持っていないことが殆どなので

全てに無いと動かないのであればもっと前に気づくようなバグが起きていても

おかしくないなぁと思ったからです(ふんわりとした推測)

Discussion