DetailPaneCardTextField
DetailPaneCard の bottomContent で、読み上げ文言などをユーザーが入力するための TextField を提供する公開関数。
value が空のときは placeholder(既定の読み上げ文言)をプレースホルダーとして表示し、 「空欄なら既定の音声で読み上げる」という状態をそのまま画面上で表現する。 入力途中の値はこの Composable 内のローカル状態として保持しつつ、1文字入力するたびに onValueChangeFinished で即座に確定(永続化)する。フォーカス喪失・Doneキー・アプリ終了といった 特定のイベントを待って確定する設計にすると、ソフトウェアキーボードを開いたままアプリを終了する等、 そのイベントが発生しない操作をされた場合に入力内容が保存されないまま失われる(実際に発生した不具合)。 1文字ごとに確定することでこの問題を避ける。
onPreviewClick が null の場合は再生ボタンを表示しない。 末尾の再生ボタンは、入力中の文言(空欄なら既定の文言)の試聴に使う。 onResetToDefault を渡すと、その左に既定値へ戻すボタンを配置する。 enabled が false、defaultValue が null、または入力中の文言と同じときは無効・透明にし、それ以外は有効にして表示する。 透明度はアニメーションし、押下時はハプティクスとコールバックを実行する。
selected が true のときは、同じ DetailPaneCard 内に並ぶ DetailPaneCardChips の選択済みチップと同じく チェックアイコンとプライマリ色のインジケーターを表示し、「いまはこちらが読み上げに使われる」ことを示す。 チップ側と selected を排他にして渡すことで、どちらが使われるかを一目で判別できるようにする。 selected の判定は onValueChangeFinished で通知される文字列に基づかせる想定(1文字入力するたびに更新される)。
insertState を渡すと、カーソル位置への挿入や選択範囲の置換を要求できる。上限を超える要求は破棄する。
supportingText の右側に、入力中の文字数と maxLength を「12/30」の形式で常に表示する。 supportingText がない場合も、文字数カウンターは右端に配置する。