2017-09-05 1 views
0

Mein Textfeld Text für onChanged: Ich versuche, eine Variable, die ich in der gleichen Klasse deklariert habe, zu ändern und es in einer ungültigen Funktion drucken zu lassen. Bitte erläutern Sie, wie Sie meinen Textfeldtext drucken.Flattern TextField Text nicht auf Variable drucken?

+1

Sie nennen könnte '_loginButton()' entweder vor dem 'return' in' build' oder als das letzte, was in der 'setState 'Funktion. Aber ich bin mir nicht sicher, ob ich Ihre Frage wirklich verstanden habe ... –

Antwort

0

Nun, ich bin mir nicht sicher, was Sie hier versuchen möchten. Aber von dem, was ich verstehe, versuchen Sie Benutzereingaben in TextField zu speichern.

Ich habe dies ohne die Notwendigkeit von setState()

Wenn Sie die Eingabe des Benutzers wie E-Mail zu erhalten, müssen erreicht, können Sie die Daten abrufen soll, nachdem der Benutzer es abgegeben hat, so dass ich bin mir nicht sicher, warum würden Sie wollen, in Ihrem Fall onChanged zu verwenden.

Grundsätzlich müssen Sie dem Benutzer eine Schaltfläche bereitstellen, die nach dem Ausfüllen der Daten gedrückt werden soll. Verwenden Sie dann TextEditingController, um zu erhalten, was der Benutzer eingegeben hat und was Sie tun möchten Dort.

Dies ist der Code, der zeigt, wie dies zu tun, ich denke, Sie versuchen, etwas ähnlich einem Sign Up-Funktionalität innerhalb der App zu tun:

import 'package:flutter/material.dart'; 

void main() { 
    runApp(new MaterialApp(
    home: new MyApp(), 
)); 
} 

class MyApp extends StatefulWidget { 
    @override 
    _MyAppState createState() => new _MyAppState(); 
} 

class _MyAppState extends State<MyApp> { 
    var _email; 
    var _password; 
    var _username; 

    final TextEditingController _nameController = new TextEditingController(); 
    final TextEditingController _emailController = new TextEditingController(); 
    final TextEditingController _passController = new TextEditingController(); 

    void _loginButton({String name, String pass, String email}) { 
    print("Login from Page"); 
    this._username = name; 
    this._email = email; 
    this._password = pass; 
    print(_username); 
    print(_email); 
    print(_password); 
    } 


    @override 
    Widget build(BuildContext context) { 
    return new Scaffold(
     body: new Column (
      mainAxisAlignment: MainAxisAlignment.center, 
      children: <Widget>[ 
      new TextField(controller: this._nameController, decoration: new InputDecoration(hintText: "Type your user name"),), 
      new TextField(controller: this._emailController,decoration: new InputDecoration(hintText: "Type your email")), 
      new TextField(controller: this._passController,decoration: new InputDecoration(hintText: "Type your password")), 

      new RaisedButton(child: new Text ("Sign In"), 
       onPressed:() { 
        _loginButton(name: this._nameController.text, 
         email: this._emailController.text, 
         pass: this._passController.text 
       ); 
       }) 
      ], 

     )); 
    } 
} 

Wenn Sie eine Taste verwenden möchten nicht, Verwenden Sie dann die Eigenschaft onSubmitted, um Benutzereingaben zu speichern, wenn die Zurück-Taste auf der Tastatur gedrückt wird, während onChanged den Wert aktualisiert, wenn die TextField gerade bearbeitet wird.

new TextField(controller: this._nameController, 
       decoration: new InputDecoration(hintText: "Type your user name"), 
       onSubmitted: (String s) { //when the user press the return button do this 
       _loginButton(name: this._nameController.text); 
       }, 
       onChanged: (String s) { //when the user is editing the text do this 
       _loginButton(name: this._nameController.text); 
       },), 

Aber wahrscheinlich wäre es besser, für Sie auf eine Schaltfläche verwenden, da Sie mehrere TextField haben, die auf einmal gespeichert werden muss.

0

Dies ist, wie ich es geschafft, diese zu vervollständigen mit onChanged: ...

new TextField(
       controller: _emailController, 
       decoration: 
        new InputDecoration(labelText: "E M A I L A D D R E S S"), 
       onChanged: (str) { 
        setState(() { 
        str = _emailController.text; 
        }); 
       }, 
      ), 

Future<Null> _loginButton() async { 
    try { 
     FirebaseAuth.instance.signOut(); 

     print("Login from Page"); 

     _email = _emailController.text.toString(); 
     _password = _passController.text.toString(); 
     _username = _nameController.text.toString(); 

     print(_email); 
     print(_username); 
     print(_password); 

     await FirebaseAuth.instance 
      .signInWithEmailAndPassword(email: _email, password: _password); 

     var userid = FirebaseAuth.instance.currentUser.uid; 

     if (FirebaseAuth.instance.currentUser.photoUrl == null) { 
     fb.child("users/${userid}/image").onValue.listen((Event event) { 
      print('Child added: ${event.snapshot.value}'); 
     }); 
     } 

     print(FirebaseAuth.instance.currentUser); 
    } catch (error) { 
     print(error); 
    } 
    } 
+0

Warum möchten Sie den Benutzer jedes Mal ausloggen, wenn er sich anmeldet? – aziza

+0

Auch OnChanged wird den Text vom Benutzer bearbeitet, ist nicht onSubmitted besser hier verwendet werden? – aziza

+0

@aziza Ich rufe ab, um sicherzustellen, dass der FirebaseUser.currentUser immer null ist, bevor ich versuche, einen anderen einzuloggen. Außerdem denke ich, dass du mit der Verwendung von onSubmitted richtig bist ... Auf diese Weise sollte ich '.whenComplete verwenden können 'Anruf und automatische Route zu meinem Menü. Ist das richtig? –

Verwandte Themen