2017-09-05 5 views
0

私のテキストフィールドのテキストonChanged:私は同じクラスで宣言した変数を変更しようとしていて、無効な関数で出力しています。テキストフィールドテキストを印刷する方法を説明してください。Flutter TextFieldテキストは変数に出力されませんか?

class LoginPageState extends State<LoginPage> { 
    @override 

    var _email; 
    var _password; 
    var _username; 

    final TextEditingController controller = new TextEditingController(); 

void _loginButton() { 

    print("Login from Page"); 
    print(_password); 
    print(_username); 
    print(_email); 
    } 

Widget build(BuildContext context) { 
    return new Scaffold(
     backgroundColor: Colors.white70, 
     appBar: new AppBar(
     backgroundColor: Colors.amber, 
     title: new Text("Login/Signup"), 
    ), 
     body: new Container(
     child: new Center(
      child: new Column(
      mainAxisAlignment: MainAxisAlignment.center, 
      children: <Widget>[ 
       new TextField(
       controller: controller, 
       decoration: 
       new InputDecoration(labelText: "E M A I L A D D R E S S"), 
       onChanged: (String newString){ 
        setState((){ 
        _email = controller.text; 

        }); 
       }, 
      ), 
+1

です'関数。しかし、私は本当にあなたの質問を理解しているかどうかわからない... –

答えて

0

ここで何をしようとしているのかよく分かりません。しかし、あなたが理解しているところでは、ユーザの入力をTextFieldに保存しようとしています。

私はあなたが電子メールなどのユーザーの入力を取得する必要がある場合、ユーザはそれを提出した後、あなたがデータを取得する必要がありますsetState()

を必要とせずにこれを達成しているので、私は、なぜあなたがしたいと思うわかりませんあなたのケースではonChangedを使用してください。

基本的には、データの入力が完了した後にボタンを押してユーザーにTextEditingControllerを入力して、ユーザーが入力した内容を取得し、必要な操作を行うことができますそこ。

これは、私はアプリ内の登機能に似て何かをしようとしている想像し、これを実行する方法を示したコードです:あなたはボタンを使用しない場合

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

     )); 
    } 
} 

を、キーボードの戻りボタンを押すとonSubmittedプロパティを使用してユーザー入力を保存し、TextFieldを編集中はonChangedが値を更新します。

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

しかし、あなたはボタンを使用するため、一度に保存する必要が複数TextFieldを持っているので、おそらくそれが良いだろう。

0

これはあなたがどちらか `SETSTATEでbuild``または最後として `return`前に` _loginButtonを() `呼び出すことができます...私は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

ログインを試みるたびにユーザーをログアウトさせたいのはなぜですか? – aziza

+0

また、onChangedは、ユーザーが編集中のテキストを返しますが、ここでは使用できません。 – aziza

+0

@aziza FirebaseUser.currentUserが常に別のログインを試みる前に必ずヌルであることを確認するためにログアウトを呼び出しています。また、あなたはonSubmittedを使用する権利があると思います。そのようにして、 '.whenComplete '私のメニューへの呼び出しと自動ルート。これは正しいです? –

関連する問題