Wie gebe ich einem Textfeld einen Anfangswert?

142

Ich möchte einem Textfeld einen Anfangswert geben und ihn mit einem leeren Wert neu zeichnen, um den Text zu löschen. Was ist der beste Ansatz, um dies mit den APIs von Flutter zu tun?

Seth Ladd
quelle

Antworten:

104

(Aus der Mailingliste. Ich habe diese Antwort nicht gefunden.)

class _FooState extends State<Foo> {
  TextEditingController _controller;

  @override
  void initState() {
    super.initState();
    _controller = new TextEditingController(text: 'Initial value');
  }

  @override
  Widget build(BuildContext context) {
    return new Column(
      children: <Widget>[
        new TextField(
          // The TextField is first built, the controller has some initial text,
          // which the TextField shows. As the user edits, the text property of
          // the controller is updated.
          controller: _controller,
        ),
        new RaisedButton(
          onPressed: () {
            // You can also use the controller to manipuate what is shown in the
            // text field. For example, the clear() method removes all the text
            // from the text field.
            _controller.clear();
          },
          child: new Text('CLEAR'),
        ),
      ],
    );
  }
}
Seth Ladd
quelle
Ich denke, Hinweis Server den gleichen Zweck.
Dhuma1981
3
Fragen Sie sich nur, auf welche Mailingliste Sie sich in der Antwort bezogen haben?
stt106
2
Und wie hängen wir den Textfeldwert an den Anfangswert an / überschreiben ihn?
Stuckedoverflow
2
Stellen Sie außerdem sicher, dass _controller in der Entsorgung des Widgets verfügbar ist. Es wird von Google empfohlen. Es stellt sicher, dass die Ressourcen freigegeben werden, wenn sie nicht benötigt werden.
Amrit Pal Singh
89

Sie können ein TextFormFieldanstelle von TextFieldund die initialValueEigenschaft verwenden. beispielsweise

TextFormField(initialValue: "I am smart")
Sami Kanafani
quelle
2
Aus irgendeinem Grund konnte ich dies nicht mit einem dynamischen Objekt verwenden. Ich brauchte den Controller.
S1r-Lanzelot
6
Dies ist nur gültig, wenn kein Controller mit einem TextFormField angegeben ist. docs.flutter.io/flutter/material/TextFormField/…
Alex Fallenstedt
@AlexFallenstedt Es gibt keine Notwendigkeit für diese Eigenschaft, wenn der Controller verfügbar ist
Sami Kanafani
Ich halte dies für riskant, da beim Neuerstellen Ihres Widget-Baums Ihr Text durch den Anfangswert ersetzt werden kann.
Gökberk Yağcı
45

Sie müssen keine separate Variable im Widget-Bereich definieren, sondern nur inline:

TextField(
  controller: TextEditingController()..text = 'Your initial value',
  onChanged: (text) => {},
)
vovahost
quelle
Was ist mit den Doppelpunkten in "TextEditingController () .. text" gemeint?
Ray Li
3
@ RayLi Es heißt Kaskadenoperator. Informationen und Beispiele finden Sie hier stackoverflow.com/questions/53136945/…
vovahost
1
Vielen Dank!. Dies ist perfekt für die dynamische Erstellung von Widgets aus Listen von Objekten :)
Davaus
Das habe ich gesucht !! Vielen Dank!
TaeJung Shim
1
@vovahost es fehlt leider der Entsorgungsteil.
Chris Rutkowski
28

Wenn Sie TextEditingController verwenden, setzen Sie den Text wie unten beschrieben darauf

TextEditingController _controller = new TextEditingController();


_controller.text = 'your initial text';

final your_text_name = TextFormField(
      autofocus: false,
      controller: _controller,
      decoration: InputDecoration(
        hintText: 'Hint Value',
      ),
    );

Wenn Sie keinen TextEditingController verwenden , können Sie initialValue wie unten beschrieben direkt verwenden

final last_name = TextFormField(
      autofocus: false,
      initialValue: 'your initial text',
      decoration: InputDecoration(
        hintText: 'Last Name',
      ),
    );

Weitere Informationen finden Sie unter TextEditingController

Nirav Bhavsar
quelle
Ich bin nicht sicher, ob es eine gute Idee ist, den Anfangswert für die textEigenschaft gemäß den Dokumenten der TextEditingController.textEigenschaft festzulegen: Wenn Sie dies festlegen, werden alle Listener dieses TextEditingControllers darüber informiert, dass sie aktualisiert werden müssen (es werden notifyListeners aufgerufen). Aus diesem Grund sollte dieser Wert nur zwischen Frames festgelegt werden, z. B. als Reaktion auf Benutzeraktionen, nicht während der Erstellungs-, Layout- oder Malphase. ( api.flutter.dev/flutter/widgets/TextEditingController/text.html )
Kirill Karmazin
14

Ich habe hier viele Möglichkeiten gesehen, dies zu tun. Ich denke jedoch, dass dies etwas effizienter oder zumindest prägnanter ist als die anderen Antworten.

TextField(
   controller: TextEditingController(text: "Initial Text here"),
)
Kent
quelle
7

Wenn Sie mehrere TextInputs verarbeiten möchten, wie von @MRT im Kommentar zur akzeptierten Antwort gefordert, können Sie eine Funktion erstellen, die einen Anfangswert annimmt und Folgendes zurückgibt TextEditingController:

initialValue(val) {
  return TextEditingController(text: val);
}

Stellen Sie dann diese Funktion als Regler für ein TextInputund geben Sie dort ihren Anfangswert wie folgt ein:

controller: initialValue('Some initial value here....')

Sie können dies für die anderen TextInputs wiederholen .

Muaad
quelle
3

innerhalb der Klasse,

  final usernameController = TextEditingController(text: 'bhanuka');

Textfeld,

   child: new TextField(
        controller: usernameController,
    ...
)
Blutverlust
quelle
3
TextEdittingController _controller = new TextEdittingController(text: "your Text");

oder

@override
  void initState() {
    super.initState();
    _Controller.text = "Your Text";
    }
seyed ali Aghamali
quelle
3

Dies kann erreicht werden mit TextEditingController.

Um einen Anfangswert zu haben, können Sie hinzufügen

TextEditingController _controller = TextEditingController(text: 'initial value');

oder

Wenn Sie verwenden TextFormField, haben Sie dort eine initialValueEigenschaft. Was dies im Grunde initialValueautomatisch an die Steuerung liefert .

TextEditingController _controller = TextEditingController();
TextFormField(
  controller: _controller,
  initialValue: 'initial value'
)

Um den Text zu löschen, können Sie die _controller.clear()Methode verwenden.

Debasmita Sarkar
quelle
-12

Wenn Sie die Antwort darauf und für diejenigen, die hierher kommen und nach einer Antwort suchen, nicht gefunden haben: InputDecorationÜberprüfen Sie den Hinweis des FeldesText:

new TextField(
  decoration: new InputDecoration(
    hintText:"My Text String."
  ),
...
user693336
quelle
Hinweis Text ist kein Anfangswert. Wenn der Benutzer etwas eingibt, verschwindet es. Der anfängliche Text ist wie das Vorschreiben von etwas für den Benutzer.
Arman Ordookhani
Dies ist der Hints Text, Not Value Initialisierer
MRT
2
Das stimmt, aber das ist gut für diejenigen, die hier nach Hinweistext suchen, aber nicht wissen, wie sie es nennen sollen.
ThinkDigital