在Flutter中创建动态单选按钮 [英] Create dynamic radio buttons in Flutter

查看:46
本文介绍了在Flutter中创建动态单选按钮的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个动态表单,其中包含一些文本框和单选按钮.我也使用RadioListTile.

I am trying to create a dynamic form which contains some textbox and radio button. I am using RadioListTile for the same.

在下面的代码中,您可以看到我正在使用 var nameController = TextEditingController(); 来获取文本框的值.我不确定RadioListTile可以使用什么.

In the below code you can see I am using var nameController = TextEditingController(); to get the value of textbox. I am not sure what can be used for RadioListTile.

我也在努力展示动态单选按钮.我在下面添加了完整的代码.如何使单选按钮正常工作并获取所选项目的值,以便将其保存到数据库中?

I am also struggling to show Radio Button Dynamically. I have added full code in the below. How can I get the radio button working and get the value of the selected items, so they can be saved to the database?

    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;
      }

更新

我想显示用户可以选择的单选按钮,并且一旦用户提交表单,我就可以获取http请求的那些值.您可以添加添加或删除卡的选项.因此,这些单选按钮也会生成.

Update

I want to show Radio buttons that user can select and once user submit the form I can get those value for http request. As you can I have added options to add or remove cards. So, these radio buttons will also generated.

推荐答案

创建字段int _selectedRadioIndex

Create field int _selectedRadioIndex

并更改代码

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(),

然后在代码中得到它fList.firstWhere((element)=> element.index == _selectedRadioIndex)

then in code just get it fList.firstWhere((element) => element.index == _selectedRadioIndex)

这篇关于在Flutter中创建动态单选按钮的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆