< d4554fc5-f9d1-4c12-8f45-4ebfadd0a74

maxLengthEnforced の代わりに maxLengthEnforcement を使用してください

まとめ

の動作を制御するにはmaxLengthの中にLengthLimitingTextInputFormatter、 使用maxLengthEnforcement現在廃止されたものの代わりにmaxLengthEnforced

コンテクスト

maxLengthEnforcedパラメータを使用して決定しました テキストフィールドで入力値を切り詰めるべきかどうか に達するとmaxLength限界かどうか (ためにTextFieldTextFormField) 代わりに警告メッセージが ユーザー入力の長さの場合の文字数 超えたmaxLength

ただし、CJK 文字を入力するには、一部の入力方法が必要です。 ユーザーは一連のラテン文字を入力する必要があります テキストフィールドに入力し、このシーケンスを変換します 目的の CJK 文字 (文章構成)。 通常、ラテン語シーケンスは結果として得られる CJK 文字よりも長くなります。 したがって、テキストフィールドにハード最大文字数制限を設定すると、 ユーザーは、次の理由によりテキストの作成を正常に完了できません。maxLength文字数制限。

テキスト合成は、一部の入力方法でも使用されます。 ハイライトされた構成内のテキストを示します 領域を入力した場合でも、領域はアクティブに編集されています。 ラテン文字。たとえば、Android 上の Gboard の英語キーボード (Android の他の多くの入力方法と同様に) 現在の単語を入力します 構成領域内。

これらのシナリオでの入力エクスペリエンスを向上させるには、 新しいトライステート列挙型、MaxLengthEnforcement、が紹介されました。 その値は、サポートされる処理戦略を説明します。 を適用するときのアクティブな構成領域LengthLimitingTextInutFormatter。 新しいmaxLengthEnforcement使用するパラメータ この列挙型は置換するためにテキスト フィールドに追加されました ブール値maxLengthEnforcedパラメータ。 新しい enum パラメータを使用すると、 開発者はさまざまな戦略を選択できます テキストフィールドが予期するコンテンツのタイプに基づきます。

詳細については、次のドキュメントを参照してください。maxLengthMaxLengthEnforcement

のデフォルト値は、maxLengthEnforcementパラメータは次から推測されます。TargetPlatformプラットフォームの規約に準拠するためにアプリケーションを変更します。

変更内容の説明

  • を追加しましたmaxLengthEnforcementパラメータを使用して、 新しい列挙型MaxLengthEnforcement、 現在は非推奨となったブール値の代替としてmaxLengthEnforcedパラメータがオンTextFieldTextFormFieldCupertinoTextField、 とLengthLimitingTextInputFormatterクラス。

移行ガイド

現在のプラットフォームのデフォルトの動作を使用することをお勧めします。 これはユーザーにとって最も馴染みのある動作となるためです。

のデフォルト値maxLengthEnforcement

  • アンドロイド、Windows:MaxLengthEnforcement.enforced。 これらのプラットフォームのネイティブ動作が強制されます。 入力値は次のいずれかにかかわらず切り捨てられます。 ユーザーが構成を使用して入力しているかどうか。
  • iOS、macOS:MaxLengthEnforcement.truncateAfterCompositionEnds。 これらのプラットフォームには「最大長」がありません。 機能のため、開発者が実装する必要があります 行動そのもの。標準的な規約はないようです これらのプラットフォームで進化してきました。私たちが選んだのは コンポジションが最大長を超えることを許可するには CJK 入力の破損を避けるため。
  • ウェブと Linux:MaxLengthEnforcement.truncateAfterCompositionEnds。 これらのプラットフォームには標準がありませんが、 (そして、競合する動作を伴う実装が多数存在します)、 一般的な慣例では、合成を許可することのようです デフォルトでは最大長を超えます。
  • フクシア:MaxLengthEnforcement.truncateAfterCompositionEnds。 このプラットフォームにはまだプラットフォーム規約がありません。 したがって、デフォルトで次の規則を選択することにしました。 データ損失が発生する可能性が最も低くなります。

制限を常に強制するには

次の場合に値を常に切り捨てる制限を適用するには、 制限に達した場合 (たとえば、 確認コード)、使用しますMaxLengthEnforcement.enforcedの 編集可能なテキストフィールド。

このオプションを使用すると、ユーザー エクスペリエンスが最適化されない可能性があります テキスト構成に依存する入力メソッドを使用します。 の使用を検討してください。truncateAfterCompositionEndsテキストフィールドに任意のユーザー入力が必要な場合のオプション CJK 文字が含まれる可能性があります。 を参照してください。コンテクスト詳細については、セクションを参照してください。

移行前のコード:

TextField(maxLength: 6)

または:

TextField(
  maxLength: 6,
  maxLengthEnforced: true,
)

移行後のコード:

TextField(
  maxLength: 6,
  maxLengthEnforcement: MaxLengthEnforcement.enforced,
)

制限を強制しないようにするには

最大長エラーを表示するにはTextField、 しかしいいえ制限を超えた場合は切り捨てられます。 使用MaxLengthEnforcement.noneそれ以外のmaxLengthEnforced: false

移行前のコード:

TextField(
  maxLength: 6,
  maxLengthEnforced: false,
)

移行後のコード:

TextField(
  maxLength: 6,
  maxLengthEnforcement: MaxLengthEnforcement.none,
)

ためにCupertinoTextFieldエラーメッセージを表示することはできませんが、 ただ設定しないでくださいmaxLength価値。

移行前のコード:

CupertinoTextField(
  maxLength: 6,
  maxLengthEnforced: false,
)

移行後のコード:

CupertinoTextField()

制限を強制するためですが、テキストの作成には適用されません

ユーザーがテキストを入力しているときにテキストが切り捨てられないようにするには 合成を使用して指定しますMaxLengthEnforcement.truncateAfterCompositionEnds。 この動作により、合成を使用する入力メソッドが可能になります。 結果のテキストより大きい領域、 たとえば中国人、日本人によくあることですが、 および韓国語 (CJK) テキストを一時的に 編集が完了するまで制限を無視してください。

Android 上の Gboard の英語キーボード (および他の多くの Android 入力メソッド) 入力された単語の構成領域を作成します。 で使用する場合truncateAfterCompositionEndsテキストフィールド、 ユーザーはすぐに止められるわけではありませんmaxLength限界。 考えますenforced自信がある場合のオプション テキストフィールドは入力メソッドでは使用されません CJK テキストなどの一時的に長い構成領域を使用するもの。

実装のコード:

TextField(
  maxLength: 6,
  maxLengthEnforcement: MaxLengthEnforcement.truncateAfterCompositionEnds, // Temporarily lifts the limit.
)

入力が構成領域を使用しないと想定することに注意してください

特定のロケールをターゲットにする場合、次のことを想定したくなります。 すべてのユーザーがそのロケールからの入力に満足できるようにするためです。 たとえば、英語を対象としたフォーラム ソフトウェア コミュニティは英語のみを扱う必要があると考えられているかもしれません 文章。ただし、この種の仮定は間違っていることがよくあります。 たとえば、英語フォーラムの参加者は 日本のアニメやベトナム料理について話したいでしょう。 おそらく参加者の一人は韓国人で、表現することを好む人でしょう。 彼らの名前で ネイティブの表意文字。このために、 自由形式フィールドでは、enforced価値 代わりに、truncateAfterCompositionEnds可能であれば値。

タイムライン

リリースされたバージョン: v1.26.0-1.0.pre
安定版リリース: 2.0.0

参考文献

設計ドキュメント:

API ドキュメント:

  • MaxLengthEnforcement
  • LengthLimitingTextInputFormatter
  • maxLength

関連する問題:

  • 問題 63753
  • 問題 67898

関連する PR:

  • PR 63754: 作成と maxLength の設定により TextField がクラッシュする問題を修正
  • PR 68086: 導入MaxLengthEnforcement