for-loop - 如何使用 DrawerHeader 和 ListView.builder 构建抽屉

标签 for-loop flutter dart widget for-in-loop

编辑2:
在花了一整天的时间之后。我终于设法使用 ListView.builder 并且我最初的问题不再是问题...... :)。但现在出现了一个更具体的问题。
显然,我遇到的所有问题都是由于在同一个抽屉上同时使用了 DrawerHeader 和 ListView.builder。我所有的尝试都会导致许多不同类型的错误。谁能告诉我如何在下面的代码中插入抽屉标题而不会出错?

import 'package:flutter/material.dart';

class MyHomePage extends StatelessWidget {

  List<String> items = [
    'Alimentação', 'Artigos para o lar', 'Beleza', 'Carros',
    'Computadores', 'Consertos', 'Construção', 'Ensino',
    'Esporte', 'Pet', 'Presentes', 'Religião',
    'Saúde', 'Serviços Gráficos', 'Serviços para o lar', 'Serviços profissionais',
  ];

  List<IconData> icones = [
    Icons.play_arrow, Icons.list, Icons.create_new_folder, Icons.add_alarm,
    Icons.insert_comment, Icons.drag_handle, Icons.ac_unit, Icons.adjust,
    Icons.airline_seat_recline_extra, Icons.forum, Icons.gamepad, Icons.hd,
    Icons.format_align_justify, Icons.keyboard, Icons.list, Icons.mail,
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(
          'Teste de app',
        ),
      ),
      drawer: Drawer(
        child: ListView.builder(
          itemCount: items.length,
          itemBuilder: (context, i){
            return ListTile(
              title: Text(items[i]),
              leading: Icon(icones[i]),
              trailing: Icon(Icons.chevron_right),
              onTap: (){
                Navigator.pop(context);
              },
            );
          },
        ),
      ),
      body: Container(
        child: Text(
            'Texto'
        ),
      ),
    );
  } 
}

编辑1:
在第一次帮助之后,我设法使用 ScrollView.builder 放置列表,但菜单不再滚动。经过一番研究,我将 ScrollView 包裹在一个固定高度的 SizedBox 中,并且它起作用了。唯一的问题是固定高度。我确定这不是最合适的方法,但是当我更改 double.infinity 的固定高度时,我得到一个错误:

在 performLayout() 期间引发了以下断言:
BoxConstraints 强制无限高。

你们能告诉我我做错了什么吗?
//----------------TEST--------------------------------
class TestDrawer extends StatelessWidget {

  @override
  Widget build(BuildContext context) {

    return Column(
      children: <Widget>[
        SizedBox(
          height: double.infinity,
          child: ListView.builder(
            itemCount: kCategorias.length,
            itemBuilder: (_, int index){
              return ListTile(
                title: Text(
                  kCategorias[index],
                ),
                leading: Icon(kIcones[index]),
                trailing: Icon(Icons.play_arrow),
                onTap: (){
                  Navigator.pop(context);
                },
              );
            },
          ),
        ),
      ],
    );
  }
}

原帖:

为了具体化,我已经开始学习 Flutter,最后我有足够的信心去“玩”我的第一个项目。这是一个简单的与交付合作的公司的 Instagram 帐户目录。如果我能完成,我将在商店推出该应用程序,以帮助本地公司应对流行病和社会孤立。

ATM 我正在​​处理应用程序的抽屉,一切都运行良好。但我被卡住了。我想创建一个类别菜单。菜单项是 ListTiles。我有两个列表来管理这个菜单。一个包含类别名称的列表,另一个包含每个类别的图标。在 future 的时刻,我需要第三个列表,其中包含每个菜单项的链接。

好吧,我需要做的就是在每个 ListTile 项中迭代这些列表中的每一个。类别列表工作 100%。当我尝试在同一个 ListTile 小部件中迭代第二个列表时,问题就开始了。

我想到解决这个问题的第一件事当然是创建一个 for 循环,并在其中使用我想要的具有相同索引的尽可能多的列表。我在 DartPad 中测试了这种可能性,并且效果很好!它完全按照我想要的方式返回。问题是,为了工作,我需要使用 for... 循环,当我将相同的想法转移到我的应用程序代码时,它只适用于单行结构(没有大括号)。一旦我放入大括号,它就会返回一个错误(元素类型 'Set<ListTile>' 不能分配给列表类型'Widget'。)但是如果我使用单行结构,我将无法迭代多个列表。 (在我看来)迭代 2 个或更多列表的唯一可能方法是使用大括号形式。

我不知道我是否足够清楚,但是,我该如何解决这个问题?如何使用 for 循环在单个 Widget 中迭代 2 个或多个列表 - 在我的情况下为 ListTile()?

下面我将附上我遇到问题的类的源代码。
如果你想看整个项目并测试here是github上项目repo的链接。

提前谢谢!
//Builds a Drawer item using ListTile()
class BuildDrawerTile extends StatelessWidget {

List<String> list;
BuildDrawerTile({@required this.list});

@override

Widget build(BuildContext context) {

return Column(
  mainAxisAlignment: MainAxisAlignment.center,
  children: <Widget>[
    for(String item in list ) ListTile( //HERE EVERYTHING WORKS WELL AS I'M NOT USING CURLY BRACKETS
      title: Text(
        item,
        style: GoogleFonts.quicksand(
          textStyle: TextStyle(
            color: Color(0xFF808080),
            fontWeight: FontWeight.w300,
          ),
        ),
      ),
      leading: Icon(Icons.play_arrow), //HERE I NEEDED TO ITERATE SPECIFIC ICONS FOR EACH ITEM
      trailing: Icon(Icons.play_arrow),
      onTap: (){
        Navigator.pop(context); //IN THE FUTURE HERE I'LL ITERATE A THIRD LIST WITH THE DESTINATIONS
      },
    ),
  ],
);
}
}

最佳答案

我有点进退两难,你想遍历图标和目的地是什么意思,但我根据我的理解回答。

如果数据按顺序排列且数据长度相同,您可以使用多个 ListView 显示数据。

您可以使用简单的 ListView 来实现它。我希望下面的代码可以帮助你。
如果您有任何疑问,请随时询问。

   List<String> items = [
    'Alimentação', 'Artigos para o lar', 'Beleza', 'Carros',
    'Computadores', 'Consertos', 'Construção', 'Ensino',
    'Esporte', 'Pet', 'Presentes', 'Religião',
    'Saúde', 'Serviços Gráficos', 'Serviços para o lar', 'Serviços profissionais',
  ];

  List<IconData> icones = [
    Icons.play_arrow, Icons.list, Icons.create_new_folder, Icons.add_alarm,
    Icons.insert_comment, Icons.drag_handle, Icons.ac_unit, Icons.adjust,
    Icons.airline_seat_recline_extra, Icons.forum, Icons.gamepad, Icons.hd,
    Icons.format_align_justify, Icons.keyboard, Icons.list, Icons.mail,
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(
          'Teste de app',
        ),
      ),
      drawer: Drawer(
        child: ListView.builder(
          itemCount: items.length,
          itemBuilder: (context, i){
            return ListTile(
              title: Text(items[i]),
              leading: Icon(icones[i]),
              trailing: Icon(Icons.chevron_right),
              onTap: (){
                Navigator.pop(context);
              },
            );
          },
        ),
      ),
      body: Container(
        child: Text(
            'Texto'
        ),
      ),
    );
  } 

结果 :

enter image description here

关于for-loop - 如何使用 DrawerHeader 和 ListView.builder 构建抽屉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61174258/

相关文章:

c++ - 使用现代 C++ 在 Eigen3 矩阵上使用 for 循环进行元素运算的优雅方式

c - 如何在c中显示输入的字母?

Flutter Mobx Observer 不重建

flutter - 应该只有一项具有 [DropdownButton] 的值

flutter:如何向底部导航栏项目添加填充,使项目彼此保持更远的距离

flutter - 具有 fitHeight 的 FittedBox 渲染图像宽度的其余部分

c - 在 C 中,如何循环每个没有连续值的枚举文字

JavaScript 函数不检索数组元素

firebase - Flutter Firebase 数据库变量在方法后未收到值

webgl - 如何在Dart WebGL应用程序中加快频段选择工具