Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
For loop 如何使用抽屉阅读器和ListView.builder构建抽屉_For Loop_Flutter_Dart_Widget_For In Loop - Fatal编程技术网

For loop 如何使用抽屉阅读器和ListView.builder构建抽屉

For loop 如何使用抽屉阅读器和ListView.builder构建抽屉,for-loop,flutter,dart,widget,for-in-loop,For Loop,Flutter,Dart,Widget,For In Loop,编辑2: 在这件事上花了一整天之后。我最终设法使用ListView.builder,我最初的问题不再是问题…:)。但现在出现了一个更具体的问题。 显然,我所面临的所有问题都是由于在同一个抽屉上同时使用了抽屉阅读器和ListView.builder。我所有的尝试都会导致许多不同类型的错误。有人能告诉我如何在下面的代码中插入抽屉标题而不出错吗 import 'package:flutter/material.dart'; class MyHomePage extends StatelessWidg

编辑2: 在这件事上花了一整天之后。我最终设法使用ListView.builder,我最初的问题不再是问题…:)。但现在出现了一个更具体的问题。 显然,我所面临的所有问题都是由于在同一个抽屉上同时使用了抽屉阅读器和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'
        ),
      ),
    );
  } 
}
导入“包装:颤振/材料.省道”;
类MyHomePage扩展了无状态小部件{
列表项=[
“Alimentação”、“Artigos para o lar”、“Beleza”、“Carros”,
“计算机”、“Consertos”、“Construção”、“Ensino”,
“电子竞技”、“宠物”、“演示者”、“Religião”,
‘Saúde’、‘Serviços Gráficos’、‘Serviços para o lar’、‘Serviços profissionais’,
];
列表图标=[
Icons.play_箭头、Icons.list、Icons.create_new_文件夹、Icons.add_报警、,
Icons.insert_comment,Icons.drag_handle,Icons.ac_unit,Icons.adjust,
Icons.airline\u seat\u reline\u extra、Icons.forum、Icons.gamepad、Icons.hd、,
Icons.format\u align\u justify、Icons.keyboard、Icons.list、Icons.mail、,
];
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:正文(
“应用测试”,
),
),
抽屉(
子项:ListView.builder(
itemCount:items.length,
itemBuilder:(上下文,i){
返回列表块(
标题:正文(第[i]项),
领先:图标(图标[i]),
尾随:图标(图标。右V形),
onTap:(){
Navigator.pop(上下文);
},
);
},
),
),
主体:容器(
子:文本(
“Texto”
),
),
);
} 
}
编辑1: 在第一次帮助之后,我使用ScrollView.builder成功地放置了列表,但是菜单不再滚动。经过一些研究后,我将ScrollView包装在一个固定高度的大小框中,它成功了。唯一的问题是固定高度。我确信这不是最合适的方法,但当我将固定高度更改为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);
                },
              );
            },
          ),
        ),
      ],
    );
  }
}
/--------------测试--------------------------------
类TestDrawer扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回列(
儿童:[
大小盒子(
高度:双无限,
子项:ListView.builder(
itemCount:kCategorias.length,
itemBuilder:(\ux,int索引){
返回列表块(
标题:正文(
kCategorias[索引],
),
前导:图标(kIcones[索引]),
尾随:图标(图标。播放箭头),
onTap:(){
Navigator.pop(上下文);
},
);
},
),
),
],
);
}
}

原职:

具体来说,我已经开始学习颤振,最后我觉得有足够的信心“玩”我的第一个项目。这是一个简单的instagram账户目录,其中包括从事快递业务的公司的账户。如果我成功完成了,我将在商店里推出这个应用程序,帮助当地公司应对混乱和社会孤立

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

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

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

我不知道我是否足够清楚,但是,我如何解决这个问题?如何使用for循环在单个小部件中迭代2个或多个列表(在我的示例中是ListTile())

下面我将附上我遇到麻烦的类的源代码。 如果您想查看整个项目,测试是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
      },
    ),
  ],
);
}
}
//使用ListTile()构建抽屉项
类BuildDrawerTile扩展了无状态小部件{
名单;
BuildDrawerTile({@required this.list});
@凌驾
小部件构建(构建上下文){
返回列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
对于(列表中的字符串项)ListTile(//这里一切正常,因为我没有使用花括号
标题:正文(
项目
样式:GoogleFonts.quicksand(
textStyle:textStyle(
颜色:颜色(0xFF808080),
fontWeight:fontWeight.w300,
),
),
),
前导:Icon(Icons.play_arrow),//这里我需要迭代S
   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'
        ),
      ),
    );
  } 
//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: _buildList(),
    );
  }

  List<Widget> _buildList() {
    List<Widget> widgets = [];
    for(String item in list ) {
      widgets.add(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
        },
      ),);
    }

    return widgets;
  }
}