Flutter 在颤振中创建动态单选按钮
我试图创建一个动态表单,其中包含一些文本框和单选按钮。我也在使用Radioistratile 在下面的代码中,您可以看到我正在使用Flutter 在颤振中创建动态单选按钮,flutter,Flutter,我试图创建一个动态表单,其中包含一些文本框和单选按钮。我也在使用Radioistratile 在下面的代码中,您可以看到我正在使用var nameController=TextEditingController()获取文本框的值。我不确定什么可以用于放射科医生 我也在努力动态显示单选按钮。我在下面添加了完整的代码。如何使单选按钮工作并获取所选项目的值,以便将其保存到数据库中 class Price extends StatefulWidget { @override
var nameController=TextEditingController()
获取文本框的值。我不确定什么可以用于放射科医生
我也在努力动态显示单选按钮。我在下面添加了完整的代码。如何使单选按钮工作并获取所选项目的值,以便将其保存到数据库中
class Price extends StatefulWidget {
@override
_PriceState createState() => _PriceState();
}
class FruitsList {
String name;
int index;
FruitsList({this.name, this.index});
}
class _PriceState extends State<Price> {
static final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final _scaffoldKey = GlobalKey<ScaffoldState>();
int currentIndex = 0;
String person;
String age;
String job;
// Default Radio Button Item
String radioItem = 'Mango';
// Group Value for Radio Button.
int id = 1;
List<FruitsList> fList = [
FruitsList(
index: 1,
name: "Mango",
),
FruitsList(
index: 2,
name: "Banana",
),
FruitsList(
index: 3,
name: "Apple",
),
FruitsList(
index: 4,
name: "Cherry",
),
];
@override
void initState() {
super.initState();
cards.add(createCard());
}
var nameTECs = <TextEditingController>[];
var ageTECs = <TextEditingController>[];
var jobTECs = <TextEditingController>[];
--- Need to help to add Controller for Radio Button ---
var cards = <Card>[];
Card createCard() {
var nameController = TextEditingController();
var ageController = TextEditingController();
var jobController = TextEditingController();
nameTECs.add(nameController);
ageTECs.add(ageController);
jobTECs.add(jobController);
return Card(
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Text('Service ${cards.length + 1}'),
TextFormField(
style: TextStyle(color: Colors.blue),
controller: nameController,
decoration: InputDecoration(labelText: 'Name'),
validator: validatetext,
onSaved: (String val) {
person = val;
},
),
TextFormField(
style: TextStyle(color: Colors.blue),
controller: ageController,
decoration: InputDecoration(labelText: 'age'),
validator: validatetext,
onSaved: (String val) {
age = val;
},
),
TextFormField(
style: TextStyle(color: Colors.blue),
controller: jobController,
decoration: InputDecoration(labelText: 'Job'),
validator: validatetext,
onSaved: (String val) {
job = val;
},
),
//Expanded(
// child: Container(
// height: 350.0,
// child:
Row(
children:
fList.map((data) => RadioListTile(
title: Text("${data.name}"),
groupValue: id,
value: data.index,
onChanged: (val) {
setState(() {
radioItem = data.name ;
id = data.index;
});
},
)).toList(),
),
//)),
/* CheckboxListTile(
title: Text("title text"),
value: checkedValue,
onChanged: (newValue) {
setState(() {
checkedValue = newValue;
});
},
//onChanged: (newValue) { ... },
controlAffinity: ListTileControlAffinity.leading, // <-- leading Checkbox
), */
SizedBox(height: 10),
],
),
// ),
);
}
void _validateInputs() {
print('button');
if (_formKey.currentState.validate()) {
_formKey.currentState.save();
_onDone();
} else {
}
}
_onDone() {
updateProfile();
List<PersonEntry> entries = [];
for (int i = 0; i < cards.length; i++) {
var name = nameTECs[i].text;
var age = ageTECs[i].text;
var job = jobTECs[i].text;
entries.add(PersonEntry(name, age, job));
}
}
///////// Save to DB ////////////////////
Future updateProfile() async{
try{
for (int i = 0; i < cards.length; i++) {
var name = nameTECs[i].text;
var age = ageTECs[i].text;
var job = jobTECs[i].text;
Map<String, dynamic> body = {'name': name, 'age': age, 'job' : job };
print(body);
nameTECs[i].clear();
//if(rang == true){
Response response =
await Dio().post("http://192.168.1.102:8080/adddetails.php", data: body);
print(response.statusCode);
if(response.statusCode == 404){
print('404');
}
if(response.statusCode == 200){
nameTECs[i].clear();
}
}
} catch (e) {
print("Exception Caught: $e");
}
}
///////////////////////////////
@override
Widget build(BuildContext context) {
return Scaffold(
key: _scaffoldKey,
appBar: myAppBar(),
endDrawer: myDrawer(),
body: Column(
children: <Widget>[
Expanded(
child:new Form(
key: _formKey,
child: ListView.builder(
itemCount: cards.length,
itemBuilder: (BuildContext context, int index) {
return cards[index];
},
),
),
),
Container(
padding: EdgeInsets.symmetric(horizontal: 2.0),
color: Colors.grey,
child:Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
// Container(
Padding(
padding: const EdgeInsets.all(16.0),
child: FloatingActionButton(
heroTag: "btn1",
child: Icon(Icons.add),
onPressed: () => setState(() => cards.add(createCard())),
backgroundColor: Colors.green,
)
/*RaisedButton(
child: Text('Add new'),
onPressed: () => setState(() => cards.add(createCard())),
),*/
),
Padding(
padding: const EdgeInsets.all(16.0),
child: FloatingActionButton(
heroTag: "btn2",
child: Icon(Icons.remove), onPressed: () => setState(() => cards.removeLast()),
backgroundColor: Colors.red,
)
),
Padding(
padding: const EdgeInsets.all(16.0),
child: FloatingActionButton(
heroTag: "btn3",
child: Icon(Icons.save), onPressed: _validateInputs),
)
],
),
),
],
),
);
}
);
}
}
class PersonEntry {
final String name;
final String age;
final String studyJob;
PersonEntry(this.name, this.age, this.studyJob);
@override
String toString() {
return 'Person: name= $name, age= $age, study job= $studyJob';
}
}
Size get preferredSize => Size.fromHeight(kToolbarHeight);
String validatetext(String value) {
if (value.length < 5)
return 'More than 5 char is required';
else
return null;
}
类价格扩展StatefulWidget{
@凌驾
_PriceState createState();
}
类水果列表{
字符串名;
整数指数;
水果列表({this.name,this.index});
}
类_PriceState扩展了状态{
静态最终全局键_formKey=GlobalKey();
最终_scaffoldKey=GlobalKey();
int currentIndex=0;
线人;
弦年龄;
字符串作业;
//默认单选按钮项
字符串放射性项='Mango';
//单选按钮的组值。
int-id=1;
列表列表列表=[
水果商(
索引:1,
名称:“芒果”,
),
水果商(
索引:2,
名称:“香蕉”,
),
水果商(
索引:3,
名称:“苹果”,
),
水果商(
索引:4,
姓名:“樱桃”,
),
];
@凌驾
void initState(){
super.initState();
添加(createCard());
}
var nameTECs=[];
var ageTECs=[];
var jobTECs=[];
---需要帮助为单选按钮添加控制器---
var卡=[];
卡片创建卡片(){
var nameController=TextEditingController();
var ageController=TextEditingController();
var jobController=TextEditingController();
nameTECs.add(nameController);
ageTECs.add(ageController);
jobTECs.add(作业控制器);
回程卡(
子:列(
mainAxisSize:mainAxisSize.min,
儿童:[
Text('Service${cards.length+1}'),
TextFormField(
样式:TextStyle(颜色:Colors.blue),
控制器:名称控制器,
装饰:输入装饰(标签文本:“名称”),
验证程序:validatetext,
onSaved:(字符串val){
person=val;
},
),
TextFormField(
样式:TextStyle(颜色:Colors.blue),
控制员:年龄控制员,
装饰:输入装饰(标签文本:“年龄”),
验证程序:validatetext,
onSaved:(字符串val){
年龄=val;
},
),
TextFormField(
样式:TextStyle(颜色:Colors.blue),
控制器:作业控制器,
装饰:输入装饰(标签文本:“作业”),
验证程序:validatetext,
onSaved:(字符串val){
job=val;
},
),
//扩大(
//子:容器(
//高度:350.0,
//儿童:
划船(
儿童:
fList.map((数据)=>radioistratile(
标题:文本(“${data.name}”),
groupValue:id,
值:data.index,
一旦更改:(val){
设置状态(){
radiotem=data.name;
id=data.index;
});
},
)).toList(),
),
//)),
/*CheckboxListTile(
标题:文本(“标题文本”),
值:checkedValue,
onChanged:(newValue){
设置状态(){
checkedValue=newValue;
});
},
//onChanged:(newValue){…},
controlAffinity:ListIlecontrolaffinity.leading,//setState(()=>cards.add(createCard()),
背景颜色:Colors.green,
)
/*升起的按钮(
子项:文本('addnew'),
按下时:()=>setState(()=>cards.add(createCard()),
),*/
),
填充物(
填充:常数边集全部(16.0),
子:浮动操作按钮(
heroTag:“btn2”,
子:图标(Icons.remove),按下时:()=>setState(()=>cards.removeLast()),
背景颜色:Colors.red,
)
),
填充物(
填充:常数边集全部(16.0),
子:浮动操作按钮(
heroTag:“btn3”,
子:图标(Icons.save),按下时:_validateInputs),
)
],
),
),
],
),
);
}
);
}
}
阶级人格{
最后的字符串名;
最终管柱年龄;
最后的字符串学习工作;
personetry(this.name,this.age,this.studyJob);
@凌驾
字符串toString(){
返回'Person:name=$name,age=$age,studyJob=$studyJob';
}
}
Size get preferredSize=>Size.fromHeight(kToolbarHeight);
字符串验证文本(字符串值){
如果(值。长度<5)
返回“需要超过5个字符”;
fList.map((data) => RadioListTile(
title: Text("${data.name}"),
groupValue: id,
value: data.index,
onChanged: (val) {
setState(() {
radioItem = data.name ;
id = data.index;
});
},
)).toList(),
fList.map((data) => RadioListTile(
title: Text("${data.name}"),
groupValue: id,
value: data.index,
onChanged: (val) {
setState(() {
radioItem = data.name ;
id = data.index;
_selectedRadioIndex = val;
});
},
)).toList(),