更快的方法实现到列表中?

问题描述 投票:0回答:1

我做了一个单选按钮的列表。但不知道如何映射它们。目前的方法是一个一个地做,这太多了,而且有10多个单选按钮,这要占用几百行代码。

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个回答
1
投票

你可以改变你的 ListMap 然后用它来将你的枚举值映射到Widgets。就像这样(声明:代码没有经过测试,但类似这样的东西应该是可能的)。

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

1
投票

你可以利用spread操作符的优势 直接在你的for循环上拆包 Column.

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;
            });
          },
        ),
    ]);
© www.soinside.com 2019 - 2024. All rights reserved.