2017-09-05 54 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

你可以稱之爲'_loginButton()'要麼在'build'或過去的事情了're​​turn'前'的setState '功能。但我不知道我是否真的明白你的問題...... –

回答

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屬性在鍵盤上按下返回按鈕時保存用戶輸入,而onChanged將在編輯TextField時更新該值。

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

這是我如何管理與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 '呼叫和自動路由到我的菜單。它是否正確? –