Flutter 在ListView.builder()中动态创建单选按钮组

Flutter 在ListView.builder()中动态创建单选按钮组,flutter,dart,flutter-layout,radio,radio-group,Flutter,Dart,Flutter Layout,Radio,Radio Group,我想创建这样一个UI 其中,在最后,我得到了所有选中单选按钮的详细信息 这是我的完整代码 当我试着这么做的时候,所有的单选按钮都转到一边 import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class Affiche_grille extends StatefulWidget { @override _QuestionWidgetState createState() =&g

我想创建这样一个UI

其中,在最后,我得到了所有选中单选按钮的详细信息

这是我的完整代码

当我试着这么做的时候,所有的单选按钮都转到一边

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class Affiche_grille extends StatefulWidget {
  @override
  _QuestionWidgetState createState() => _QuestionWidgetState();
}

int selectedRadio;
int _groupValue = -1;

class _QuestionWidgetState extends State<Affiche_grille> {
  List<RadioModel> sampleData = new List<RadioModel>();

  @override
  void initState() {
    super.initState();
    sampleData.add(new RadioModel(false, 'A', 'April 18', 'text1'));
    sampleData.add(new RadioModel(false, 'B', 'April 17', 'text2'));
    sampleData.add(new RadioModel(false, 'C', 'April 16', 'text3'));
    sampleData.add(new RadioModel(false, 'D', 'April 15', 'text4'));
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("ListItem"),
      ),
      body: ListView.builder(
        itemCount: sampleData.length,
        itemBuilder: (context, index) => ButtonBar(
          alignment: MainAxisAlignment.center,
          children: <Widget>[
            _myRadioButton(
              title: "Checkbox 0",
              value: 0,
              onChanged: (newValue) => setState(() => _groupValue = newValue),
            ),
            _myRadioButton(
              title: "Checkbox 1",
              value: 1,
              onChanged: (newValue) => setState(() => _groupValue = newValue),
            ),
          ],
        ),
      ),
    );
  }
}

Widget _myRadioButton({String title, int value, Function onChanged}) {
  return Radio(
    value: value,
    groupValue: _groupValue,
    onChanged: onChanged,
  );
}

class RadioModel {
  bool isSelected;
  final String buttonText;
  final String text;
  final String text1;

  RadioModel(this.isSelected, this.buttonText, this.text, this.text1);
}
import'包装:flift/cupertino.dart';
进口“包装:颤振/材料.省道”;
类Affiche\u扩展StatefulWidget{
@凌驾
_QuestionWidgetState createState()=>\u QuestionWidgetState();
}
int-selectedRadio;
int _groupValue=-1;

class\u QuestionWidgetState扩展状态

当其值==groupValue 在您的情况下,所有8个收音机共享一个groupValue,对于所有行,第一个值为0,第二个值为1

然后单击“左收音机全局值”将设置为0,然后启用所有左收音机(其值均为0),反之亦然

要创建要执行的操作,应为每个收音机设置唯一值,并为每行设置唯一的groupValue

这里有一个有效的例子

class Affiche_grille extends StatefulWidget {
  @override
  _QuestionWidgetState createState() => _QuestionWidgetState();
}

class _QuestionWidgetState extends State<Affiche_grille> {
  List<RadioModel> sampleData = [];
  List<int> groupValue = [];
  List<List<int>> value = [];

  @override
  void initState() {
    super.initState();
    sampleData.add(new RadioModel(false, 'A', 'April 18', 'text1'));
    sampleData.add(new RadioModel(false, 'B', 'April 17', 'text2'));
    sampleData.add(new RadioModel(false, 'C', 'April 16', 'text3'));
    sampleData.add(new RadioModel(false, 'D', 'April 15', 'text4'));

    groupValue.add(0);
    groupValue.add(2);
    groupValue.add(4);
    groupValue.add(6);

    value.add([0,1]);
    value.add([2,3]);
    value.add([4,5]);
    value.add([6,7]);
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("ListItem"),
      ),
      body: ListView.builder(
        itemCount: sampleData.length,
        itemBuilder: (context, index) => ButtonBar(
          alignment: MainAxisAlignment.center,
          children: <Widget>[
            Radio(
              groupValue: groupValue[index],
              value: value[index][0], 
              onChanged: (newValue) => setState(() => groupValue[index] = newValue),  
            ),
            Radio(
              groupValue: groupValue[index],
              value: value[index][1],
              onChanged: (newValue) => setState(() => groupValue[index] = newValue),  
            ),
          ],
        ),
      ),
    );
  }
}
class-Affiche\u扩展StatefulWidget{
@凌驾
_QuestionWidgetState createState()=>\u QuestionWidgetState();
}
类_QuestionWidgetState扩展状态{
列出sampleData=[];
列表组值=[];
列表值=[];
@凌驾
void initState(){
super.initState();
添加(新的RadioModel(false,'A','April 18','text1');
sampleData.add(新的RadioModel(false,'B','April 17','text2');
sampleData.add(新的RadioModel(false,'C','April 16','text3');
sampleData.add(新的RadioModel(false,'D','April 15','text4');
groupValue.add(0);
增加(2);
增加(4);
增加(6);
增值([0,1]);
增值([2,3]);
增值([4,5]);
增值([6,7]);
}
@凌驾
小部件构建(构建上下文){
归还新脚手架(
appBar:新的appBar(
标题:新文本(“列表项”),
),
正文:ListView.builder(
itemCount:sampleData.length,
itemBuilder:(上下文,索引)=>按钮栏(
对齐:MainAxisAlignment.center,
儿童:[
无线电(
groupValue:groupValue[索引],
值:值[索引][0],
一旦更改:(newValue)=>setState(()=>groupValue[index]=newValue),
),
无线电(
groupValue:groupValue[索引],
价值:价值[指数][1],,
一旦更改:(newValue)=>setState(()=>groupValue[index]=newValue),
),
],
),
),
);
}
}
根据以下内容:

如果groupValue和value匹配,将选择此收音机。大多数小部件将通过调用State.setState来更新单选按钮的groupValue来响应onChanged

在您的案例中,每个问题代表一组收音机。每个问题的答案都需要一个变量。您不能仅用一个
\u groupValue
变量保存所有答案

因此,每个问题需要有两个可能的值,并且它们必须被视为一个单独的组

有很多方法可以做到这一点,但其中之一是:

List<int> groupValues; //Will hold the selected answer for each Question

void initState() {
    super.initState();
    sampleData.add(new RadioModel(false, 'A', 'April 18', 'text1'));
    sampleData.add(new RadioModel(false, 'B', 'April 17', 'text2'));
    sampleData.add(new RadioModel(false, 'C', 'April 16', 'text3'));
    sampleData.add(new RadioModel(false, 'D', 'April 15', 'text4'));
    groupValues = List.filled(sampleData.length, -1); // Fills the initial value.
  }
记住,
onChanged
回调也需要使用更新的索引调用:

onChanged: (newValue) => setState(() => groupValues[index]= newValue),
index: index,

作为一个额外的提示,这会在屏幕上创建对小部件的依赖。这是一个很好的例子,但是小部件应该是独立的。因此,组值应该是从小部件传递的内容,而不是文件中的全局变量。我这样做是为了使它更接近您给定的示例。

以及如何获取所有选定答案选定的答案是groupValue的当前值,因为您在更改回调时更改了groupValue
onChanged: (newValue) => setState(() => groupValues[index]= newValue),
index: index,