Flutter如何动态改变textfield的标签
Flutter how change dynamic the lable of textfield
我正在尝试在单击单选按钮后更改文本字段的标签。
这是我的例子:
如果我点击私人单选按钮,文本字段标签应该改变。
如果我单击单选按钮,我会尝试更改变量。
变量值改变但不更新标签
这里是完整代码:
//check radio
List<bool> btn_radio = [true, false];
//field name
String? lable;
//controller
TextEditingController _controller_Name = new TextEditingController();
class DebugPage extends StatefulWidget {
@override
_DebugPage createState() => _DebugPage();
}
class _DebugPage extends State<DebugPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: customSubAppBar("Debug", context),
body: _body(context));
}
}
//body
_body(context) {
return Center(
child: Column(
mainAxisSize: MainAxisSize.max,
children: [
Container(height: MediaQuery.of(context).size.height * 0.3),
BuildAppRadioButton(),
BuildAppFieldName(),
],
),
);
}
//radio button
class BuildAppRadioButton extends StatefulWidget {
@override
_BuildAppRadioButton createState() => _BuildAppRadioButton();
}
//radio button
class _BuildAppRadioButton extends State<BuildAppRadioButton> {
@override
Widget build(BuildContext context) {
return Row(
children: [
//spacer
Spacer(),
//radio button
Container(
width: MediaQuery.of(context).size.width * 0.37,
child: CustomRadioButtonRegister(
isPressed: btn_radio[0],
label: 'Private',
padding: const EdgeInsets.symmetric(horizontal: 5.0),
value: true,
groupValue: btn_radio[0],
onChanged: (bool newValue) {
setState(() {
btn_radio[0] = true;
btn_radio[1] = false;
lable = 'label';
});
},
),
),
//spacer
Spacer(),
//radion button
Container(
width: MediaQuery.of(context).size.width * 0.37,
child: CustomRadioButtonRegister(
isPressed: btn_radio[1],
label: "Company",
padding: const EdgeInsets.symmetric(horizontal: 5.0),
value: true,
groupValue: btn_radio[1],
onChanged: (bool newValue) {
setState(() {
btn_radio[1] = true;
btn_radio[0] = false;
});
},
),
),
//spacer
Spacer(),
],
);
}
}
//name
class BuildAppFieldName extends StatefulWidget {
@override
_BuildAppFieldName createState() => _BuildAppFieldName();
}
//name
class _BuildAppFieldName extends State<BuildAppFieldName> {
@override
Widget build(BuildContext context) {
return Container(
width: MediaQuery.of(context).size.width * 0.8,
height: MediaQuery.of(context).size.height * 0.09,
child: TextFormField(
//controller: _controller_companyName,
style: TextStyle(
color: Colors.black,
),
decoration: InputDecoration(
labelText: lable,
labelStyle: TextStyle(
color: Colors.black,
),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: Colors.black,
),
),
),
onChanged: (value) {},
),
);
}
}
任何人都知道我该怎么做。
非常感谢 (:
没有完整的代码,我假设 BuildAppRadioButton
和 BuildAppFieldName
是更高级别的 Column() 或类似容器 Widget 中的兄弟姐妹。
您需要一种方法让 RadioButton 小部件与 FieldName 小部件进行通信。最简单的方法是使用回调通过父窗口小部件状态。
在父有状态小部件中,创建一个字符串变量来保存您的标签 String _textFieldLabel
和一个回调:
_onRadioButtonChange(String label) {
setState(() {
_textFieldLabel=label;
});
}
将此回调作为 Function onChanged;
传递给 BuildAppRadioButton() - 即 onChanged: _onRadioButtonChange,
。将 _textFieldLabel 传递给 BuildAppFieldName()
.
在您的 BuildAppRadioButton()->CustomRadioButtonRegister()->onChanged() 中调用带有正确标签的回调:
onChanged: (bool newValue) {
setState(() {
btn_radio[1] = true;
btn_radio[0] = false;
});
widget.onChanged("Label_for_field");
},
我正在尝试在单击单选按钮后更改文本字段的标签。
这是我的例子:
如果我点击私人单选按钮,文本字段标签应该改变。 如果我单击单选按钮,我会尝试更改变量。 变量值改变但不更新标签
这里是完整代码:
//check radio
List<bool> btn_radio = [true, false];
//field name
String? lable;
//controller
TextEditingController _controller_Name = new TextEditingController();
class DebugPage extends StatefulWidget {
@override
_DebugPage createState() => _DebugPage();
}
class _DebugPage extends State<DebugPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: customSubAppBar("Debug", context),
body: _body(context));
}
}
//body
_body(context) {
return Center(
child: Column(
mainAxisSize: MainAxisSize.max,
children: [
Container(height: MediaQuery.of(context).size.height * 0.3),
BuildAppRadioButton(),
BuildAppFieldName(),
],
),
);
}
//radio button
class BuildAppRadioButton extends StatefulWidget {
@override
_BuildAppRadioButton createState() => _BuildAppRadioButton();
}
//radio button
class _BuildAppRadioButton extends State<BuildAppRadioButton> {
@override
Widget build(BuildContext context) {
return Row(
children: [
//spacer
Spacer(),
//radio button
Container(
width: MediaQuery.of(context).size.width * 0.37,
child: CustomRadioButtonRegister(
isPressed: btn_radio[0],
label: 'Private',
padding: const EdgeInsets.symmetric(horizontal: 5.0),
value: true,
groupValue: btn_radio[0],
onChanged: (bool newValue) {
setState(() {
btn_radio[0] = true;
btn_radio[1] = false;
lable = 'label';
});
},
),
),
//spacer
Spacer(),
//radion button
Container(
width: MediaQuery.of(context).size.width * 0.37,
child: CustomRadioButtonRegister(
isPressed: btn_radio[1],
label: "Company",
padding: const EdgeInsets.symmetric(horizontal: 5.0),
value: true,
groupValue: btn_radio[1],
onChanged: (bool newValue) {
setState(() {
btn_radio[1] = true;
btn_radio[0] = false;
});
},
),
),
//spacer
Spacer(),
],
);
}
}
//name
class BuildAppFieldName extends StatefulWidget {
@override
_BuildAppFieldName createState() => _BuildAppFieldName();
}
//name
class _BuildAppFieldName extends State<BuildAppFieldName> {
@override
Widget build(BuildContext context) {
return Container(
width: MediaQuery.of(context).size.width * 0.8,
height: MediaQuery.of(context).size.height * 0.09,
child: TextFormField(
//controller: _controller_companyName,
style: TextStyle(
color: Colors.black,
),
decoration: InputDecoration(
labelText: lable,
labelStyle: TextStyle(
color: Colors.black,
),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: Colors.black,
),
),
),
onChanged: (value) {},
),
);
}
}
任何人都知道我该怎么做。 非常感谢 (:
没有完整的代码,我假设 BuildAppRadioButton
和 BuildAppFieldName
是更高级别的 Column() 或类似容器 Widget 中的兄弟姐妹。
您需要一种方法让 RadioButton 小部件与 FieldName 小部件进行通信。最简单的方法是使用回调通过父窗口小部件状态。
在父有状态小部件中,创建一个字符串变量来保存您的标签 String _textFieldLabel
和一个回调:
_onRadioButtonChange(String label) {
setState(() {
_textFieldLabel=label;
});
}
将此回调作为 Function onChanged;
传递给 BuildAppRadioButton() - 即 onChanged: _onRadioButtonChange,
。将 _textFieldLabel 传递给 BuildAppFieldName()
.
在您的 BuildAppRadioButton()->CustomRadioButtonRegister()->onChanged() 中调用带有正确标签的回调:
onChanged: (bool newValue) {
setState(() {
btn_radio[1] = true;
btn_radio[0] = false;
});
widget.onChanged("Label_for_field");
},