使用TextEditingController,如Retrieve the value of a text field 中所述。
TextFormField 将控制器作为构造函数参数,您可以通过类似的构造函数将其传递给您的 InputFieldArea:
class InputFieldArea extends StatelessWidget {
final TextEditingController controller;
final bool obscureText;
// ...
const InputFieldArea({Key key, this.controller, this.obscureText}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
color: Colors.orange,
// ...
child: TextFormField(
controller: controller,
obscureText: obscureText,
// ...
),
);
}
}
控制器存储在State 中很重要,这样如果小部件由于某种原因被重建,控制器不会被重新创建:
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final _usernameController = TextEditingController();
final _passwordController = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Column(
children: <Widget>[
InputFieldArea(
controller: _usernameController,
obscureText: false,
),
InputFieldArea(
controller: _passwordController,
obscureText: true,
),
RaisedButton(
onPressed: () {
// example how to read the current text field values
print('username: ${_usernameController.text}, password: ${_passwordController.text}');
},
)
],
)
);
}
}
还可以查看shrine login demo。