【问题标题】:Quicker way to implement into a list?实现列表的更快方法?
【发布时间】:2020-09-01 16:00:24
【问题描述】:

我正在制作单选按钮列表。但无法想出一种方法来映射它们。当前的方法是一个一个的制作太多,有1​​0多个单选按钮,这占用了数百行代码。

enum SingingCharacter {char1, char2, char3, char4}
class _HomeScreenState extends State<HomeScreen> {
  SingingCharacter _character = SingingCharacter.char1;

  final List myList= ['One','Two','Thre' ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Home'),
        ),
        body: Container(
          child: Column(children: <Widget>[
            RadioListTile<SingingCharacter>(
              title: Text('${myList[0]}'),
              value: SingingCharacter.char1,
              groupValue: _character,
              onChanged: (SingingCharacter value) {
                setState(() {
                  _character = value;
                });
              },
            ),
            RadioListTile<SingingCharacter>(
              title: Text('${myList[1]}'),
              value: SingingCharacter.char2,
              groupValue: _character,
              onChanged: (SingingCharacter value) {
                setState(() {
                  _character = value;
                });
              },
            )
            ....
          ]),
        ));
  }
}

有什么方法可以循环播放并显示在孩子身上吗? 谢谢

【问题讨论】:

    标签: list flutter dart radiobuttonlist


    【解决方案1】:

    您可以将您的List 更改为Map,然后使用它来将您的枚举值映射到小部件。像这样(免责声明:代码未经测试,但这样的事情应该是可能的):

    enum SingingCharacter {char1, char2, char3}
    
    class _HomeScreenState extends State<HomeScreen> {
      SingingCharacter _character = SingingCharacter.char1;
    
      final Map<SingingCharacter, String> radioMap = {SingingCharacter.char1: 'One', SingingCharacter.char2: 'Two', SingingCharacter.char3: 'Three'};
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Home'),
          ),
          body: Container(
            child: Column(
              children: _generateRadioButtons()
            ),
          )
        );
      }
    
      List<Widget> _generateRadioButtons() {
        return SingingCharacter.values.map((char) {
          return RadioListTile<SingingCharacter>(
            title: Text('${radioMap[char]}'),
            value: char
            groupValue: _character,
            onChanged: (SingingCharacter value) {
              setState(() {
                _character = value;
              });
            },
          );
        }).toList();
      }
    }
    

    【讨论】:

    • 不幸的是,这会返回错误。 getter not found 这个char1: 'One', char2: 'Two', char3: 'Three'。而且返回也没有像预期的那样工作List&lt;Widget&gt;
    • 枚举现在可以工作了。但是返回没有按预期工作List&lt;Widget&gt; 出现以下错误:Error: A value of type 'Iterable&lt;Set&lt;RadioListTile&lt;SingingCharacter&gt;&gt;&gt;' can't be assigned to a variable of type 'List&lt;Widget&gt;'.
    • 啊,是的。映射需要转换成带有toList() 的列表。请看看这是否有效。
    【解决方案2】:

    您可以利用展开运算符并直接在 Column 上展开 for 循环。

    final List myList= ['One','Two','Thre' ];
    
        return Column(children: [
          for (int i = 0; i < myList.length; i++)
            RadioListTile<SingingCharacter>(
              title: Text(myList[i]),
              value: SingingCharacter.values[i],
              groupValue: _character,
              onChanged: (SingingCharacter value) {
                setState(() {
                  _character = value;
                });
              },
            ),
        ]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-31
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 2018-09-11
      相关资源
      最近更新 更多