web-dev-qa-db-fra.com

onChange TextField déplace le curseur pour commencer en flottement

J'essaie de vérifier l'entrée avec la méthode onChange dans TextField mais après avoir remplacé le texte par TextEditingController le curseur se déplace au début de TextField.

Ce problème se produit uniquement sur la plate-forme Android.

Code

TextField(
controller: textEditController,
onChanged: (content) {
                    textEditController.text = checkNumber(content);
                  },)

version flottante

[✓] Flutter (Channel master, v1.2.2-pre.41, on Mac OS X 10.14.3 18D109, locale
    en-IR)
[✓] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
9
Saman

Définissez la sélection à l'aide de TextEditingController

TextField(
controller: textEditController,
onChanged: (content) {
  textEditController..text = checkNumber(content)
                    ..selection = TextSelection.collapsed(offset: 0);
  },
)
18
Günter Zöchbauer

La solution acceptée n'a pas fonctionné pour moi - car je définissais à la fois la sélection de texte et J'avais besoin de définir à la place la valeur .

La documentation classe TextEditingController indique:

Le texte ou les propriétés de sélection peuvent être définis à partir d'un écouteur ajouté à ce contrôleur. Si les deux propriétés doivent être modifiées, la valeur du contrôleur doit être définie à la place.

La documentation contient également un exemple pertinent qui comprend les éléments suivants:

void initState() {
  _controller.addListener(() {
    final text = _controller.text.toLowerCase();
    _controller.value = _controller.value.copyWith(
      text: text,
      selection: TextSelection(baseOffset: text.length, extentOffset: text.length),
      composing: TextRange.empty,
    );
  });
  super.initState();
}

Cela force le texte saisi à être en minuscules et maintient le curseur à la fin de l'entrée.

1
Nick Meinhold