Добавить список <Widget>в ListView.children динамически - PullRequest
0 голосов
/ 14 октября 2018

Я пытаюсь динамически построить часть моего ListView.children[], но мне не удается отправить их в уже существующий массив.Вот мой упрощенный код:

  Widget buildNavigationDrawer(BuildContext context) {
    return Drawer(
      child: ListView(
        // Important: Remove any padding from the ListView.
        padding: EdgeInsets.zero,
        children: <Widget>[
          DrawerHeader(...code for header of drawer),

          _buildUserGroups(context).map((Widget item)=> item),

          ListTile(
            leading: Icon(Icons.account_circle),
            title: Text('Settings'),
            onTap: () {
              Navigator.push(
                  context,
                  FadeTransitionRoute(
                      builder: (context) => MainSettingsPage()));
            },
          ),
        ],
      ),
    );
  }

Где _buildUserGroups() функция выглядит следующим образом (упрощенно):

  List<Widget> _buildUserGroups(BuildContext context) {
    var userGroup = List<Widget>();
    userGroup.add(Text("Users"));

    for (var i = 0; i < 5; i++) {
      userGroup.add(Text("User " + i.toString()));
    }

    return userGroup;
  }

Я пытался использовать _buildUserGroups(context).forEach(), _buildUserGroups(context).map() илипросто вывести результат как _buildUserGroups(context);все же он терпит неудачу и говорит то же самое сообщение об ошибке:

[dart] Тип элемента 'Iterable' не может быть назначен типу списка 'Widget'.

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

Ответы [ 3 ]

0 голосов
/ 14 октября 2018

Оберните его с помощью ExpansionTile или столбца

Проблема:

_buildUserGroups(context).map((Widget item)=> item),

Решение: 1

ExpansionTile(
     title: Text("New List"),
     children:  _buildUserGroups(context).map((Widget item)=> item),
   )

Решение: 2

Column(
     children:  _buildUserGroups(context).map((Widget item)=> item),
   )

Примечание: Итерация присваивается только Children:, поскольку она получает List<Widget>.Вы устанавливаете итерацию для одного ребенка widget, поэтому вы получаете ошибку.

Я надеюсь, что это решит вашу проблему.Удачного кодирования !!

0 голосов
/ 15 октября 2018

Как указывают другие ответы, проблема заключается в _buildUserGroups(context), так как он возвращает список виджетов, в результате чего получается вложенный список.

Начиная с Dart 2.3 (представлен Flutter в Google I / O'19), вы можете использовать оператор распространения ..., который развернет внутренний список, поэтому его элементы станут элементами внешнего списка:

Widget buildNavigationDrawer(BuildContext context) {
  return Drawer(
    child: ListView(
      children: [
        DrawerHeader(...),
        ..._buildUserGroups(context),
        ListTile(...)
      ],
    ),
  );
}

Для получения дополнительной информации очто делает оператор спреда, ознакомьтесь с языковым туром Дарт .


Оригинальный ответ (до Дарт 2.3):

Вы можете завернутьвызов функции в Column или ExpansionTile.

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

Widget buildNavigationDrawer(BuildContext context) {
  final items = <Widget>[];
  items.add(DrawerHeader(...));
  items.addAll(_buildUserGroups(context));
  items.add(ListTile(...));

  return Drawer(child: ListView(children: items));
}

Если вы настаиваете на встроенном решении, вы также можете использовать .followedBy(...) чтобы добавить элементы в список:

Widget buildNavigationDrawer(BuildContext context) {
  return Drawer(
    child: ListView(
      children: [ DrawerHeader(...) ]
        .followedBy(_buildUserGroups(context))
        .followedBy([ ListTile(...) ])
    ),
  );
}
0 голосов
/ 14 октября 2018

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

Column(
  crossAxisAlignment: CrossAxisAlignment.start,
  children: _buildUserGroups(context),
),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...