Jak podać wartość początkową w polu tekstowym?


163

Chciałbym podać wartość początkową w polu tekstowym i ponownie narysować ją pustą wartością, aby wyczyścić tekst. Jakie jest najlepsze podejście do tego z interfejsami API Fluttera?

Odpowiedzi:


117

(Z listy mailingowej. Nie znalazłem tej odpowiedzi).

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'),
        ),
      ],
    );
  }
}

Myślę, że serwery podpowiedzi mają ten sam cel.
dhuma1981

3
Zastanawiam się tylko, do której listy mailingowej odnosiłeś się w odpowiedzi?
stt106

2
I w jaki sposób dodamy / zastąpimy wartość pola tekstowego do wartości początkowej?
stuckedoverflow

2
Pamiętaj również, aby usunąć _controller w dyspozycji widżetu. Jest zalecane przez Google. Zapewnia zwolnienie zasobów, gdy nie są potrzebne.
Amrit Pal Singh

111

Możesz użyć TextFormFieldzamiast TextFieldi użyć initialValuewłaściwości. na przykład

TextFormField(initialValue: "I am smart")

2
Z jakiegoś powodu nie mogłem tego użyć z dynamicznym obiektem. Skończyło się na tym, że potrzebowałem kontrolera.
S1r-Lanzelot

7
Jest to poprawne tylko wtedy, gdy kontroler nie jest określony za pomocą TextFormField. docs.flutter.io/flutter/material/TextFormField/…
Alex Fallenstedt

1
@AlexFallenstedt ta właściwość nie jest potrzebna, gdy kontroler jest dostępny
Sami Kanafani

Myślę, że jest to ryzykowne, ponieważ podczas przebudowywania drzewa widżetów tekst można zastąpić wartością początkową.
Gökberk Yağcı

64

Nie musisz definiować osobnej zmiennej w zakresie widżetu, po prostu zrób to w tekście:

TextField(
  controller: TextEditingController()..text = 'Your initial value',
  onChanged: (text) => {},
)

1
Co oznaczają podwójne kropki w „TextEditingController () .. tekst”?
Ray Li

4
@RayLi Nazywa się to operatorem kaskadowym. Aby uzyskać informacje i przykłady, sprawdź tutaj stackoverflow.com/questions/53136945/…
vovaost

1
Dzięki!. To idealne rozwiązanie do dynamicznego tworzenia widżetów z list obiektów :)
davaus

1
To jest to, czego szukałem !! Wielkie dzięki!
TaeJung Shim

4
@vovaost niestety brakuje części do utylizacji.
Chris Rutkowski

33

Jeśli używasz TextEditingController, ustaw na niego tekst, jak poniżej

TextEditingController _controller = new TextEditingController();


_controller.text = 'your initial text';

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

a jeśli nie używasz żadnego TextEditingController , możesz bezpośrednio użyć initialValue, jak poniżej

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

Aby uzyskać więcej informacji, TextEditingController


Nie jestem pewien, czy dobrym pomysłem jest ustawienie wartości początkowej textwłaściwości zgodnie z dokumentami TextEditingController.textwłaściwości: ustawienie tego spowoduje powiadomienie wszystkich słuchaczy tego TextEditingController, że muszą zaktualizować (wywołuje notifyListeners). Z tego powodu ta wartość powinna być ustawiana tylko między klatkami, np. W odpowiedzi na działania użytkownika, a nie w fazie budowania, układu lub malowania. ( api.flutter.dev/flutter/widgets/TextEditingController/text.html )
Kirill Karmazin,

24

Widziałem tutaj wiele sposobów na zrobienie tego. Myślę jednak, że jest to trochę bardziej wydajne lub przynajmniej zwięzłe niż inne odpowiedzi.

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

najprostsza odpowiedź
Adham

13

Można to osiągnąć za pomocą TextEditingController.

Aby mieć wartość początkową, możesz dodać

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

lub

Jeśli używasz TextFormField, masz tam initialValuenieruchomość. Który zasadniczo zapewnia to initialValuedo kontrolera automatycznie.

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

Aby usunąć tekst, możesz użyć _controller.clear()metody.


7

Jeśli chcesz obsłużyć wiele TextInputs zgodnie z pytaniem @MRT w komentarzu do zaakceptowanej odpowiedzi, możesz utworzyć funkcję, która przyjmuje wartość początkową i zwraca TextEditingControllertaką:

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

Następnie ustaw tę funkcję jako kontroler dla TextInputi podaj tam jej wartość początkową w następujący sposób:

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

Możesz to powtórzyć dla pozostałych TextInput.


5
TextEdittingController _controller = new TextEdittingController(text: "your Text");

lub

@override
  void initState() {
    super.initState();
    _Controller.text = "Your Text";
    }

3

w klasie,

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

Pole tekstowe,

   child: new TextField(
        controller: usernameController,
    ...
)

-13

Jeśli nie znalazłeś odpowiedzi na to i dla tych, którzy przyjeżdżają tutaj w poszukiwaniu odpowiedzi: InputDecorationSprawdź podpowiedź do pola Tekst:

new TextField(
  decoration: new InputDecoration(
    hintText:"My Text String."
  ),
...

Tekst podpowiedzi nie jest wartością początkową. Gdy użytkownik coś wpisze, to zniknie. Początkowy tekst jest jak wstępne napisanie czegoś dla użytkownika.
Arman Ordookhani

To jest tekst wskazówek, nie inicjator wartości
MRT

3
To prawda, ale jest to dobre dla tych, którzy przyjeżdżają tutaj, szukając tekstu podpowiedzi, ale nie wiedzą, jak to nazwać.
ThinkDigital
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.