从另一个小部件访问 Controller.isEmpty
access Controller.isEmpty from another widget
所以,我的主 class 中有一个文本小部件,我制作了另一个包含 TextFormField 的 class。
根据文本字段是否为空,我想更改主 class.
中文本的颜色
如果我将文本字段放在与我的文本小部件相同的 class 中,我就可以访问控制器以读出文本字段是否为空。
现在的问题是,当我将文本字段放在单独的 class 中时,我无法找到从主 class.
访问该控制器的方法
我在 Dart 中传入和传出数据时遇到了很多困难,所以希望这会启发我的思路。
在相同 class
时有效
child: Text(
'This is a Text',
style: TextStyle(
color: txtFieldController.value.text.isEmpty? Colors.red : Colors.green,
),
),
我试过“导入''作为表单”;并尝试使用 form.textfieldClass().txtFieldcontroller 访问它,但这似乎不起作用。
在两个 classes 中为控制器创建一个 属性,在主 class 中创建控制器,然后将其传递给表单 class.
class MainWidget extends StatelessWidget {
// create controller
final txtFieldController = TextEditingController();
// pass the controller to the other class \/
final formWidget = FormWidget(txtFieldController: txtFieldController);
// ...
}
class FormWidget extends StatelessWidget {
// create controller
final TextEditingController txtFieldController;
// ...
}
完整示例代码:
表单小部件
class FormWidget extends StatelessWidget {
// create a property for the controller \/
final TextEditingController txtFieldController;
const FormWidget({Key key, this.txtFieldController}) : super(key: key);
@override
Widget build(BuildContext context) {
return Center(
child: TextFormField(
controller: txtFieldController,
),
);
}
}
主要小部件
class MainWidget extends StatefulWidget {
@override
_MainWidgetState createState() => _MainWidgetState();
}
class _MainWidgetState extends State<MainWidget> {
final txtFieldController = TextEditingController();
@override
void initState() {
// updates the widget on changes
// note, the docs say: 'Avoid calling setState() high up in the tree if the change is contained to a small part of the tree.'
// but it's not a big deal in this case
txtFieldController.addListener(() {
setState(() {});
});
super.initState();
}
@override
void dispose() {
txtFieldController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(
'This is a Text',
style: TextStyle(
color: txtFieldController.value.text.isEmpty ? Colors.red : Colors.green,
),
),
// pass the controller to the other class \/
FormWidget(txtFieldController: txtFieldController)
],
),
),
);
}
}
所以,我的主 class 中有一个文本小部件,我制作了另一个包含 TextFormField 的 class。 根据文本字段是否为空,我想更改主 class.
中文本的颜色如果我将文本字段放在与我的文本小部件相同的 class 中,我就可以访问控制器以读出文本字段是否为空。
现在的问题是,当我将文本字段放在单独的 class 中时,我无法找到从主 class.
访问该控制器的方法我在 Dart 中传入和传出数据时遇到了很多困难,所以希望这会启发我的思路。
在相同 class
时有效child: Text(
'This is a Text',
style: TextStyle(
color: txtFieldController.value.text.isEmpty? Colors.red : Colors.green,
),
),
我试过“导入''作为表单”;并尝试使用 form.textfieldClass().txtFieldcontroller 访问它,但这似乎不起作用。
在两个 classes 中为控制器创建一个 属性,在主 class 中创建控制器,然后将其传递给表单 class.
class MainWidget extends StatelessWidget {
// create controller
final txtFieldController = TextEditingController();
// pass the controller to the other class \/
final formWidget = FormWidget(txtFieldController: txtFieldController);
// ...
}
class FormWidget extends StatelessWidget {
// create controller
final TextEditingController txtFieldController;
// ...
}
完整示例代码:
表单小部件
class FormWidget extends StatelessWidget {
// create a property for the controller \/
final TextEditingController txtFieldController;
const FormWidget({Key key, this.txtFieldController}) : super(key: key);
@override
Widget build(BuildContext context) {
return Center(
child: TextFormField(
controller: txtFieldController,
),
);
}
}
主要小部件
class MainWidget extends StatefulWidget {
@override
_MainWidgetState createState() => _MainWidgetState();
}
class _MainWidgetState extends State<MainWidget> {
final txtFieldController = TextEditingController();
@override
void initState() {
// updates the widget on changes
// note, the docs say: 'Avoid calling setState() high up in the tree if the change is contained to a small part of the tree.'
// but it's not a big deal in this case
txtFieldController.addListener(() {
setState(() {});
});
super.initState();
}
@override
void dispose() {
txtFieldController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(
'This is a Text',
style: TextStyle(
color: txtFieldController.value.text.isEmpty ? Colors.red : Colors.green,
),
),
// pass the controller to the other class \/
FormWidget(txtFieldController: txtFieldController)
],
),
),
);
}
}