【问题标题】:List of Radio button in flutter颤振中的单选按钮列表
【发布时间】:2020-06-21 22:13:26
【问题描述】:

对于我的项目,我显示了一个足球比赛列表,供用户选择(3 个单选按钮,值为“1”“N”或“2”)。

示例:我需要这样的足球比赛列表:

阿森纳-托特纳姆热刺 1 N 2 利物浦-曼彻斯特 1 N 2 PSG-多特蒙德 1 N 2

1 N 2 是单选按钮,每个成员可以在每个游戏的 3 值之间进行选择。问题是我看不到如何识别每个单选按钮是唯一的。最后我需要显示一个验证按钮,允许成员保存每个选择的结果。为了简单起见,如果您为 3 个游戏选择 1,我需要通过 php api 将“111”传递给外部服务器

这是我用单选按钮显示表单的代码:请注意,游戏来自列表 (values.map),因此游戏数量可能会有所不同

import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'dart:async';

// Create a Form widget.
class Affiche_grille extends StatefulWidget {
  @override
  _Affiche_grille_State createState() {
    return _Affiche_grille_State();
  }
}

// Create a corresponding State class.
// This class holds data related to the form.

class _Affiche_grille_State extends State<Affiche_grille> {
  @override
  final _formKey = GlobalKey<FormState>();

  Future <List<Match>> Grille_display() async {
    // SERVER LOGIN API URL
    var url = 'http://www.axis-medias.fr/game_app/display_grid.php';

    // Store all data with Param Name.
    var data = {'id_grille': 1};

    // Starting Web API Call.
    var response = await http.post(url, body: json.encode(data));

    // Getting Server response into variable.

    var jsondata = json.decode(response.body);

    List<Match> Matchs = [];

    for (var u in jsondata) {
      Match match = Match(u["equipe1"],u["equipe2"],u["type_prono"]);
      Matchs.add(match);
    }

    return Matchs;
  }

  List<String> radioValues = [];

  @override
  Widget build(BuildContext context) {

    final appTitle = 'MONEYFREE';

    return MaterialApp(
      title: appTitle,
      home: Scaffold(
        appBar: AppBar(
          title: Text(appTitle),
        ),
        body: Container(
          child:
            FutureBuilder(
              future: Grille_display(),
              builder: (BuildContext context, AsyncSnapshot snapshot) {
                if (snapshot.data == null) {
                  return Container (
                    child: Center(
                      child: Text("Loading...")
                    )
                  );
                }
                else {
                List<Match> values = snapshot.data;
                values.forEach((m){
                  radioValues.add("N");
                  //like N or something
                });
                print('valeur radio après initialisation');
                print(radioValues);
                return Form(
                      key: _formKey,
                      child: Column(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: <Widget>[
                          DataTable(
                            columnSpacing: 20,
                            columns: [
                              DataColumn(
                                label: Text("Libelle Match"),
                                numeric: false,
                                tooltip: "",
                              ),
                              DataColumn(
                                label: Text("1"),
                                numeric: false,
                                tooltip: "",
                              ),
                              DataColumn(
                                label: Text("N"),
                                numeric: false,
                                tooltip: "",
                              ),
                              DataColumn(
                                label: Text("2"),
                                numeric: false,
                                tooltip: "",
                              ),
                            ],
                            rows:
                            List.generate(values.length, (index) {
                              return DataRow(
                                  cells: [
                                    DataCell(
                                      Text(values[index].equipe1.toString() + " - " + values[index].equipe2.toString()),
                                    ),
                                    DataCell(
                                      Radio(
                                        value: "1",
                                        groupValue: radioValues[index],
                                        onChanged: (val) {
                                          setState(() {
                                            radioValues[index] = val;
                                            print('Change 1');
                                            print(radioValues);
                                          });
                                        },
                                      ),
                                    ),
                                    DataCell(
                                      Radio(
                                        value: "N",
                                        groupValue: radioValues[index],
                                        onChanged: (val) {
                                          setState(() {
                                            radioValues[index] = val;
                                            print(radioValues);
                                          });
                                        },
                                      ),
                                    ),
                                    DataCell(
                                      Radio(
                                        value: "2",
                                        groupValue: radioValues[index],
                                        onChanged: (val) {
                                          setState(() {
                                            radioValues[index] = val;
                                            print(radioValues);
                                          });
                                        },
                                      ),
                                    ),
                                  ]
                              );
                            }).toList(),
                          ),
                          Center(
                            child: RaisedButton(
                              color: Colors.green,
                              textColor: Colors.white,
                              padding: EdgeInsets.fromLTRB(9, 9, 9, 9),
                              child: Text('VALIDER VOTRE GRILLE'),
                              onPressed: () {
                                Valide_grille();
                              },
                            ),
                          ),
                        ],
                      )
                  );
                };
                },
            ),
        ),
      ),
      );
  }
  Future Valide_grille() async{
    // For CircularProgressIndicator.
    bool visible = false ;
    // Showing CircularProgressIndicator.
    setState(() {
      visible = true ;
    });

    // SERVER LOGIN API URL
    var url = 'http://www.axis-medias.fr/game_app/valide_grid.php';

    // Store all data with Param Name.
    var data = jsonEncode(radioValues);

    print(radioValues);
    // Starting Web API Call.
    var response = await http.post(url, body: json.encode(data));

    // Getting Server response into variable.
    var message = json.decode(response.body);

    // If the Response Message is Matched.
    if(message == 'OK')
    {
      print('VALIDATION DE LA GRILLE OK');
      // Hiding the CircularProgressIndicator.
      setState(() {
        visible = false;
      });

    }else{

      // If Email or Password did not Matched.
      // Hiding the CircularProgressIndicator.
      setState(() {
        visible = false;
      });

      // Showing Alert Dialog with Response JSON Message.
      showDialog(
        context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            title: new Text(message),
            actions: <Widget>[
              FlatButton(
                child: new Text("OK"),
                onPressed: () {
                  Navigator.of(context).pop();
                },
              ),
            ],
          );
        },
      );
    }
  }
  }

class Match {

  final String equipe1;
  final String equipe2;
  final String typeprono;

  const Match(this.equipe1, this.equipe2, this.typeprono);

}

【问题讨论】:

    标签: flutter radio-button


    【解决方案1】:

    如果您想创建单选按钮列表,请使用 RadioListTile

    详情请查看此链接:https://api.flutter.dev/flutter/material/RadioListTile-class.html

    --希望对你有所帮助

    【讨论】:

      【解决方案2】:

      创建一个全局列表

      List<String> radioValues = [];
      

      并在您将数据分配给无线电的位置分配每个默认值

      values.forEach((m){
      radioValues.add(/*assign default values here*/);
      //like N or something
      });
      
      rows: List.generate(values.length, (index){
                                return DataRow(
                                  cells: [
                                    DataCell(
                                      Text(values[index].equipe1.toString()+" - "+match.equipe2.toString()),
                                    ),
                                    DataCell(
                                      Radio(
                                        value:"1",
                                        groupValue: radioValues[index],
                                        onChanged: (val) {
                                          setState(() {
                                            radioValues[index] = val;
                                          });
                                        },
                                      ),
                                    ),
                                    DataCell(
                                      Radio(
                                        value:"N",
                                        groupValue: radioValues[index],
                                        onChanged: (val) {
                                          setState(() {
                                            radioValues[index] = val;
                                          });
                                        },
                                      ),
                                    ),
                                    DataCell(
                                      Radio(
                                        value:"2",
                                        groupValue:radioValues[index],
                                        onChanged: (val) {
                                          setState(() {
                                            radioValues[index] = val;
                                          });
                                        },
                                      ),
                                    ),
                                  ]
                                    );
                              }).toList(),
      

      【讨论】:

      • 我不明白你的代码:(对于我现在拥有的行:rows: values.map((match) => DataRow() 你把 List.generate 你不要使用我的数据看起来和我需要输入的内容:radioValues.add(/*assign default values here*/); 如果我想将“N”设置为单选按钮的默认值,我需要输入“N”?所以它创建带有索引和值的收音机选项卡?索引到底来自哪里???谢谢
      • 我已经测试了您的代码,似乎没有语法错误,但是当我显示结果时,我看到我无法更改单选按钮的值,默认情况下在 N 值上选择它很好,但是当我点击 1 或 2 时,它无法更改为其他值,它没有任何作用,这很奇怪谢谢
      • 我已经测试了“val”和“index”的值,当我更改单选按钮时两者都是正确的,所以我认为解决方案接近 Onchanged 似乎有效,但单选按钮不会更改为 1如果我点击 1 它总是显示 N 谢谢
      • 我已经用你的新代码改变了,但问题是一样的。我已经用完整的代码更新了我的第一条消息。当我看到列表全部选择为“N”并且如果我想更改为“1”例如第一个匹配单选按钮块并保持在“N”
      • 现在它经过小幅修正后可以工作,但我还有另一个问题,这对我来说似乎很奇怪。每次更改值时,我都会显示表格的内容,以查看是否一切正确,这是结果。似乎表的初始化是在开始时完成的(正确的),但是当我将一个单选按钮的值更改为“1”时,例如初始化再次完成 2 次......所以需要包含 7 个结果的表在之后包含 21 个结果修正一个单选按钮
      【解决方案3】:

      您可以使用 pub.dev 上提供的自定义电台组列表包 https://pub.dev/packages/custom_radio_group_list

      如果要使用字符串列表生成单选按钮列表

      像这样传递字符串列表。 您可以通过仅传递它的索引来设置选定的项目。

           RadioGroup(
               radioList: sampleListString,
               selectedItem: 1,
               onChanged: (value) {
                  print('Value : ${value}');
                 },
               disabled: true)
      

      如果您想使用任何对象生成单选按钮列表。 只需将该 Object 转换为 Map 并创建一个 Map 列表和需要显示其数据的键。

      然后像下面这样使用它。

           RadioGroup(
                      radioListObject: sampleList,
                      textParameterName: 'data',
                      selectedItem: 1,
                      onChanged: (value) {
                      print('Value : ${value}');
                      } )
      

      【讨论】:

        猜你喜欢
        • 2021-01-21
        • 2020-03-04
        • 2021-08-11
        • 1970-01-01
        • 2020-11-05
        • 2019-12-12
        • 2020-05-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多