我试图获取TextFormField值。但是结果是null
主页
children:[
UrlTextField(),
UsernameTextField(),
UrlButton()
]
UrlTextField(),类似于UsernameTextField()
class UrlTextField extends StatelessWidget {
final myController = TextEditingController();
@override
Widget build(BuildContext context) {
return AppTextField(
decoration:
InputDecoration(prefixText: "https://", labelText: "Enter your URL"),
myController: myController,
textInputType: TextInputType.url,
);}}
AppTextField()这是一个普通的类,我到处都使用了该类
class AppTextField extends StatelessWidget {
final InputDecoration decoration;
var myController = TextEditingController();
final TextInputType textInputType;
AppTextField({
this.decoration,
this.myController,
this.textInputType
});
@override
Widget build(BuildContext context) {
return TextFormField(
controller: myController,
keyboardType: textInputType,
textAlign: TextAlign.left,
decoration: decoration
);}}
点击按钮或任何其他区域时,我需要获取Url和Username值,
class UrlButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
return AppButton(
onPressed: () {
String url = UrlTextField().myController.text;
String username = UsernameTextField().myController.text;
print('url is $text');
});}}
AppButton()此类也很常见
class AppButton extends StatelessWidget {
final VoidCallback onPressed;
AppButton({
this.buttonTextStyle
});
@override
Widget build(BuildContext context) {
return RaisedButton(
child: Text(...),
onPressed: onPressed);}}
答案 0 :(得分:2)
您正试图从刚刚在按钮的onPressed
中实例化的控制器中检索文本,因此到目前为止不能有任何文本!要解决此问题,您需要某种状态管理方式来访问和更改现有的窗口小部件(在您的情况下为UrlTextField
小部件)。我将为您提供一个示例,说明如何快速解决此问题:
主页:
class MainPage extends StatefulWidget {
...
@override
createState() => _MainPageState();
}
class _MainPageState extends State<MainPage> {
UrlTextField _urlTextField = UrlTextField();
...
children:[
_urlTextField,
UsernameTextField(),
UrlButton(_urlTextField)
]
现在我们实例化了一个UrlTextField
,它可以引用并可以传递给另一个小部件,例如UrlButton
:
class UrlButton extends StatelessWidget {
final UrlTextField urlTextField;
UrlButton(this.urlTextField);
@override
Widget build(BuildContext context) {
return AppButton(
onPressed: () {
String url = this.urlTextField.myController.text;
String username = UsernameTextField().myController.text;
print('url is $text');
}
);
}
}
通过这种方式,您实例化了一个UrlTextField
并在主页中使用它,用户可以在其中填写一些输入并将其传递给UrlButton
,在这里您可以访问其控制器,因此可以访问其文本。
我建议您进一步研究“状态管理”主题,因为有很多方法可以处理这种情况。我建议您看一下Provider
,它非常易于使用并且方便访问某些数据。
答案 1 :(得分:0)
text
中print('url is $text');
的值是不是应该像这样print('url is $url');
答案 2 :(得分:0)
我认为这是您要尝试做的...。但是兄弟有很多漏洞。 要记住的一件事..对于每个TextField,您需要单独的控制器,您不能将其中一个声明为myController并将其分配给所有。它们都将具有相同的值。
class StackHelp extends StatefulWidget {
@override
_StackHelp createState() => _StackHelp();
}
class _StackHelp extends State<StackHelp> {
final TextEditingController myController = TextEditingController();
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return SafeArea(
child: new Scaffold(
body: Column(children: <Widget>[
UrlTextField(myController),
// UsernameTextField(),
UrlButton(myController)
])),
);
}
}
class UrlTextField extends StatelessWidget {
final TextEditingController myController;
UrlTextField(this.myController);
@override
Widget build(BuildContext context) {
return AppTextField(
decoration:
InputDecoration(prefixText: "https://", labelText: "Enter your URL"),
myController: myController,
textInputType: TextInputType.url,
);
}
}
class AppTextField extends StatelessWidget {
final InputDecoration decoration;
final TextEditingController myController;
final TextInputType textInputType;
AppTextField({this.decoration, this.myController, this.textInputType});
@override
Widget build(BuildContext context) {
return TextFormField(
controller: myController,
keyboardType: textInputType,
textAlign: TextAlign.left,
decoration: decoration);
}
}
class UrlButton extends StatelessWidget {
final TextEditingController myController;
UrlButton(this.myController);
@override
Widget build(BuildContext context) {
void onPressed() {
String url = this.myController.text;
// String username = UsernameTextField().myController.text;
print('url is $url');
}
return AppButton(onPressed);
}
}
class AppButton extends StatelessWidget {
final VoidCallback onPressed;
AppButton(this.onPressed);
@override
Widget build(BuildContext context) {
return RaisedButton(child: Text('Test'), onPressed: onPressed);
}
}