嗯,我不知道你在這裏做什麼。但根據我的理解,您試圖在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
需要立刻被保存使用的按鈕。
你可以稱之爲'_loginButton()'要麼在'build'或過去的事情了'return'前'的setState '功能。但我不知道我是否真的明白你的問題...... –