添加列表<;Widget>;动态地ListView.children

添加列表<;Widget>;动态地ListView.children,listview,dart,flutter,Listview,Dart,Flutter,我正在尝试动态构建我的ListView.children[]的一部分,但是我无法将它们推送到已经存在的数组中。以下是我的简化代码: Widget buildNavigationDrawer(BuildContext context) { return Drawer( child: ListView( // Important: Remove any padding from the ListView. padding: EdgeInsets

我正在尝试动态构建我的
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()));
            },
          ),
        ],
      ),
    );
  }
我曾尝试使用
\u buildUserGroups(context).forEach()
\u buildUserGroups(context).map()
,或者像
\u buildUserGroups(context)
那样简单地转储结果;但它失败了,并显示了相同的错误消息:

[dart]无法将元素类型“Iterable”分配给 列表类型“小部件”


我很肯定这是一种方法,但我想不出来。如果您能为我提供任何帮助或建议,我将不胜感激,因为我现在陷入了困境。

我的想法过于复杂,我看不出有一个简单的解决方案一直摆在我面前。我最终将它包装在
列中
小部件中,解决了这个问题:

Column(
  crossAxisAlignment: CrossAxisAlignment.start,
  children: _buildUserGroups(context),
),
用ExpansionFile或Column包装它 问题:

_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),
   )
注意: Iterable只分配给
子项:
,因为它得到一个
列表
。您正在为单子
小部件
设置iterable,这就是您出错的原因


我希望这能解决你的问题。快乐编码

正如其他答案所指出的,
\u buildUserGroups(context)
是一个问题,因为它返回一个小部件列表,导致一个嵌套列表

自Dart 2.3(在Google I/O'19中引入颤振)以来,您可以使用扩展运算符
..
,它将打开内部列表,因此其元素将成为外部列表的元素:

Widget buildNavigationDrawer(BuildContext上下文){
回程抽屉(
子:ListView(
儿童:[
付款人(…),
…构建用户组(上下文),
ListTile(…)
],
),
);
}
有关spread操作符的更多信息,请查看


原始答案(在Dart 2.3之前):

_buildUserGroups(context).map((Widget item)=> item),
您可以将函数调用包装在
扩展文件

然而,这将在小部件树中引入一个新的小部件。 诚然,对性能的影响很小,但在我看来,一个更干净的解决方案是构建如下小部件列表:

Widget buildNavigationDrawer(BuildContext上下文){
最后项目=[]
…添加(抽屉阅读器(…)
…addAll(_buildUserGroups(上下文))
…添加(列表块(…);
退货抽屉(子项:列表视图(子项:项目));
}
如果坚持使用内联解决方案,还可以使用
。followerby(…)
将项目添加到列表中:

Widget buildNavigationDrawer(BuildContext上下文){
回程抽屉(
子:ListView(
儿童:[付款人(…)]
.followerby(_buildUserGroups(上下文))
.followerby([ListTile(…)]))
),
);
}

不知道followerby。谢谢