2017-11-21 2 views
2

Wie kann ich den Status jedes Formularfelds speichern, wenn das Formular vom Bildschirm gescrollt wird? Ich verliere die Werte, die ich in die TextFormFields eingegeben habe, wenn ich nach oben scrollen und die Felder sind aus dem Bildschirm.Verlust des Status jedes Formularfelds, wenn das Formular vom Bildschirm gescrollt wird?

Ich habe den Vorschlag gehört, es im Controller zu speichern und dann initialvalue von TextFormField wie im Code zu sehen zuweisen, aber es funktioniert nicht für mich. Was vermisse ich?

TextEditingController _controller = new TextEditingController(); 

@override 
    Widget build(BuildContext context) { 
    return new Scaffold(
     key: scaffoldKey, 
     appBar: new AppBar(
     title: new Text('Enter Vehicle'), 
    ), 
     body: new Padding(
      padding: const EdgeInsets.all(16.0), 
      child: new Form(
       key: formKey, 
       child: new ListView(children: <Widget>[ 
       new TextFormField(
        decoration: new InputDecoration(labelText: 'Vehicle Number'), 
        controller: _controller, 
        initialValue: _controller.text, 
       ), 
       new TextFormField(
        decoration: new InputDecoration(labelText: 'Tag'), 
       ), 
       new TextFormField(
        decoration: new InputDecoration(labelText: 'Make'), 
       ), 
       new TextFormField(
        decoration: new InputDecoration(labelText: 'Model'), 
       ), 
       new TextFormField(
        decoration: new InputDecoration(labelText: 'Year'), 
       ), 
       new TextFormField(
        decoration: new InputDecoration(labelText: 'Vehicle Type'), 
       ), 
       new TextFormField(
        decoration: new InputDecoration(labelText: 'Location'), 
       ), 
       new TextFormField(
        decoration: new InputDecoration(labelText: 'Fuel'), 
       ), 
       new TextFormField(
        decoration: new InputDecoration(labelText: 'Other'), 
       ), 
       new TextFormField(
        decoration: new InputDecoration(labelText: 'Your password'), 
        validator: (val) => 
        val.length < 6 ? 'Password too short.' : null, 
        onSaved: (val) => _password = val, 
        obscureText: true, 
       ), 
       new RaisedButton(
        onPressed: _submit, 
        child: new Text('Login'), 
       ), 
       ],) 
     ) 
    ), 
    ); 
    } 

Antwort

0

Sie benötigen ein spezielles TextEditingController für jeden TextFormField und ich glaube nicht, dass Sie das initialValue Attribut auf den Feldern haben müssen.

Werfen Sie einen Blick auf diese Antwort https://stackoverflow.com/a/45242235/6414732, die auch helfen kann.

+0

Das sieht wie ein großer Schmerz aus. Es ist einfacher, Formularfelder nicht zu verwenden und stattdessen ein benutzerdefiniertes "Reaktionsformular" zu erstellen. – Darky

+0

Oder vielleicht nicht eine ListView, die Elemente aus dem Widget-Baum entfernt, sobald sie außer Sichtweite sind. Solange die Liste nicht Hunderte von Feldern lang ist, sollte dies kein Problem sein. –

+1

Eigentlich hatte ich das schon probiert. Ich habe einen TextEditingController auf jedem TextFormField. Innerhalb von build() habe ich den Controller jedes Felds den relevanten Feldwerten zugewiesen und dann jeden Feldwert dem zugehörigen TextFormField-Initialwert zugewiesen. Aber selbst dann funktioniert es immer noch nicht, außer ** setState ** wird aufgerufen, um Werte beizubehalten. Es fühlt sich nicht richtig an. Ich weiß, dass sie offene Tickets haben, um die Handhabung von Formularen zu verbessern. Das war eine größere Sache, um zu arbeiten, als ich dachte. Eine bessere Lösung wird wahrscheinlich irgendwann entstehen. In der Zwischenzeit werde ich mich mit meiner Hacky-Lösung begnügen. – baksoy

0
new Container(
        padding: const EdgeInsets.only(
         left: 20.0, right: 20.0, top: 0.0, bottom: 0.0), 
        child: new EnsureVisibleWhenFocused(
        focusNode: _focusNode_nooftickets, 
        child: new TextFormField(
         controller: _ticketscontroller, 
         initialValue: _ticketscontroller.text, 
         focusNode: _focusNode_nooftickets, 
         keyboardType: TextInputType.number, 
         inputFormatters: <TextInputFormatter>[ 
         WhitelistingTextInputFormatter.digitsOnly 
         ], 
         validator: validatenooftickets, 
         onSaved: (String value) { 
         ticketmode.nooftickets = value; 
         }, 
        ), 
       ), 
       ), 
Verwandte Themen