Как построить ящик с DrawerHeader и ListView.builder - PullRequest
0 голосов
/ 12 апреля 2020

РЕДАКТИРОВАТЬ 2: Потратив на это целый день. Мне наконец удалось работать с ListView.builder, и моя первоначальная проблема больше не является проблемой ... :). Но теперь появилась более конкретная проблема c. Очевидно, все проблемы, с которыми я столкнулся, были связаны с использованием 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, я получаю ошибку:

Следующее утверждение было брошено во время executeLayout (): 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 компаний, которые работают с доставкой. Если мне удастся закончить sh, я запусту приложение в магазине, чтобы помочь местным компаниям справиться с пандемией и социальной изоляцией.

Банкомат Я работаю над ящиком приложения и все работает довольно хорошо. Но я застрял. Я хочу создать меню категорий. Пунктами меню являются ListTiles. У меня есть два списка для управления этим меню. Один список с названиями категорий и другой с иконками каждой из категорий. В будущем мне понадобится третий список со ссылками для каждого элемента меню.

Что ж, все, что мне нужно сделать, - это перебрать каждый из этих списков внутри каждого элемента ListTile. Список категорий работал на 100%. Проблема началась, когда я попытался перебрать второй список в том же виджете ListTile.

Первое, что пришло мне в голову, чтобы решить эту проблему, это, конечно, создать сингл для l oop и внутри него использовать столько списков, сколько я хотел с тем же индексом. Я протестировал эту возможность в DartPad, и она отлично работала! Он вернулся именно так, как я хотел. Проблема в том, что для работы мне нужно использовать for ... l oop, и когда я перенес ту же идею в код приложения, он работал только с однострочной структурой (без фигурных скобок). Как только я поставил фигурные скобки, он возвращает ошибку (тип элемента 'Set<ListTile>' не может быть назначен типу списка 'Widget'.) Но если я использую однострочную структуру, я не возможность повторять более одного списка. Единственный возможный (на мой взгляд) способ перебора двух или более списков - это использование фигурных скобок.

Я не знаю, достаточно ли я ясен, но как я могу решить эту проблему? Как я могу перебрать 2 или более списков внутри одного виджета - в моем случае ListTile () - используя for для l oop?

Ниже я приложу исходный код класса, у которого проблемы с. Если вы хотите увидеть весь проект и проверить , здесь - это ссылка на репозиторий проекта на github.

Заранее спасибо!

//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
      },
    ),
  ],
);
}
}

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Я немного в дилемме, что вы подразумеваете под тем, что вы хотите перебирать значки и места назначения, но я отвечаю на основании того, что я понимаю.

Вы можете отображать данные, используя множественный просмотр списка, если данные последовательность и длина данных одинаковы.

Вы можете использовать простой просмотр списка для достижения этого. Я надеюсь, что следующий код может помочь вам. если у вас есть какие-либо вопросы, не стесняйтесь спрашивать.

   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

0 голосов
/ 12 апреля 2020

Вы можете просто переместить свою логику сборки ListTile c другим способом.

//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;
  }
} 
...