我正在创建一个天气应用,在这个应用中,我向一个TextField提供一个位置字符串,并在其中获取文本。我知道如果我每次都使用TextField widget,我可以做到这一点,但我想使用代码重用性,这就是为什么我创建了一个不同的Widget,名为TextFieldWidget,我在其中提供了一个提示变量,它将返回其中的文本。我不知道如何做返回文本。这是我的代码。
import 'package:flutter/material.dart';
class TextFieldWidget extends StatefulWidget {
final String _hint;
TextFieldWidget(this._hint);
@override
_TextFieldWidgetState createState() => _TextFieldWidgetState();
}
class _TextFieldWidgetState extends State<TextFieldWidget> {
TextEditingController _textEditingController;
InputDecoration _inputdecoration;
@override
void initState() {
super.initState();
_textEditingController = TextEditingController();
_inputdecoration = InputDecoration(hintText: widget._hint,floatingLabelBehavior: FloatingLabelBehavior.always);
}
@override
Widget build(BuildContext context) {
return TextField(
autocorrect: true,
controller: _textEditingController,
keyboardType: TextInputType.text,
enableSuggestions: true,
decoration: _inputdecoration,
onSubmitted: (value){
// somehow return data
// I want to access this part..
},
);
}
}
1. 你必须在调用类里面创建一个方法
void _setTextValue(String value) {
// Submitted text should appear here from value
}
TextFieldWidget(_setTextValue)
2. 在TextFormField内使用这个,然后
final Function _setValue;
TextFieldWidget(this._setValue);
3. 内部提交的呼叫
widget._setValue(value);
最后,你将在调用类
已编辑。
我们可以在调用widgets的时候添加回调,用指定的参数来调用,这才是正确的方法。
例子:
class _TextFieldWidgetState extends State<TextFieldWidget> {
TextEditingController _textEditingController;
InputDecoration _inputdecoration;
@override
void initState() {
super.initState();
_textEditingController = TextEditingController();
_inputdecoration = InputDecoration(hintText: 'UserName',floatingLabelBehavior: FloatingLabelBehavior.always);
}
@override
Widget build(BuildContext context) {
return TextField(
autocorrect: true,
controller: _textEditingController,
keyboardType: TextInputType.text,
enableSuggestions: true,
decoration: _inputdecoration,
onSubmitted: (value){
widget.getUserName(value);
// somehow return data
// I want to access this part..
},
);
}
}
调用上面的代码
TextFieldWidget(getUserName: (value) {
// Get the username here
print(value);
}),
注:我们可以像这样添加多个命名参数