【问题标题】:Nesting ListView into DropdownMenu将 ListView 嵌套到 DropdownMenu
【发布时间】:2020-07-14 12:13:55
【问题描述】:

我创建了一个自定义 ListView,我想将它作为项目嵌套到我的下拉菜单中。目前,我收到'NoSuchMethodError:方法'map'在null'上被调用。我似乎无法正确映射它。我对 Flutter 很陌生。

  • ListView 的代码
class TheDetails extends StatelessWidget {

  TheDetails({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return ListView(
      padding: const EdgeInsets.all(8.0),
      itemExtent: 70.0,
      children: <CustomListItem>[
        CustomListItem(
          accName: 'Salary Account',
          accNumber: 'Savings XXX-X-XX563-9',
          accBalance: '56,302.56',
        ),
        CustomListItem(
          accName: 'Salary Account 2',
          accNumber: 'Savings XXX-X-XX563-9',
          accBalance: '89,302.56',
        ),
        CustomListItem(
          accName: 'Vayu Meetang',
          accNumber: 'Savings XXX-X-XX563-9',
          accBalance: '100,505.56',
        ),
      ],
    );
  }
}
  • DropdownButton 的代码
class SelectAccount extends StatefulWidget {
  @override
  _SelectAccountState createState() => _SelectAccountState();
}

class _SelectAccountState extends State<SelectAccount> {
  var dropdownValue;
  var accountNames;

  @override
  Widget build(BuildContext context) {
    return Container(
      constraints: BoxConstraints.expand(width: 375.0, height: 120.0),
      decoration: BoxDecoration(
        color: Colors.white,
        border: Border.all(color: Colors.grey),
        borderRadius: BorderRadius.circular(20.0),
      ),
      child: DropdownButton<String>(
        value: dropdownValue,
        underline: Container(
          height: 2,
        ),
        icon: Icon(Icons.keyboard_arrow_down,
        color: Colors.blue[500],),
        onChanged: (String newValue) {
          setState(() {
            dropdownValue = newValue;
          });
        },
        items: accountNames.map((item){
          return DropdownMenuItem(
            value: item,
            child: TheDetails(),
          );
        }).toList(),
      ),
    );
  }
}

【问题讨论】:

    标签: flutter listview dart drop-down-menu


    【解决方案1】:

    您在未初始化的accountNames 上调用.map(),因此至少在第一次构建时调用null。所以var accountNames = []; 会解决这个问题。

    为列表的每个成员添加小部件的更简洁的方法是:

    items: [
        for(var name in accountNames)
            DropdownMenuItem(value: name, child: TheDetails()),
    ]
    

    编辑:将所有内容放在一起:

    // in top-level or another file
    class Account {
      Account(this.name, this.number, this.balance);
      String name;
      String number;
      String balance;
    }
    
    
    // in _SelectAccountState or a provider
    var selectedAccount = 'Savings XXX-X-XX563-9';
    
    var accounts = [
      Account(
        'Salary Account',
        'Savings XXX-X-XX563-7',
        '56,302.56',
      ),
      Account(
        'Salary Account 2',
        'Savings XXX-X-XX563-8',
        '89,302.56',
            ),
      Account(
        'Vayu Meetang',
        'Savings XXX-X-XX563-9',
        '100,505.56',
      ),
    ];
    
    // In the build method
    DropdownButton<String>(
      value: selectedAccount,
      items: [
      for(var account in accounts)
        DropdownMenuItem<String>(
          value: account.number,
          child: Text(account.name),),
      ],
      onChanged: (val) => setState(() => selectedAccount = val)
    ),
    

    【讨论】:

    • hai 非常感谢您的建议。我试过了,'for'语句出现错误。你能帮我吗?谢谢
    • 在您的 pubspec.yaml 中,最低 SDK 版本应至少为 2.6.0。
    • 错误已解决,但是当我点击下拉菜单时,它没有展开以显示列表。
    • 那是因为列表是空的,你需要填充它。您想要所有的 CustomListItems 一个选项,还是每个 CustomListItem 一个选项?
    • 我希望它是每个 CustomListItem 的一个选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    相关资源
    最近更新 更多