如何迭代对象列表并使用颤振在小部件中获取它们的属性?

Posted

技术标签:

【中文标题】如何迭代对象列表并使用颤振在小部件中获取它们的属性?【英文标题】:How can i iterate a list of objects and get their properties within a widget using flutter? 【发布时间】:2022-01-05 00:40:59 【问题描述】:

class drinkMenu extends StatelessWidget 
  int i = 0;
  @override
  Widget build(BuildContext context) 
    Size screenSize = MediaQuery.of(context).size;
    List<products> _products = <products>[];
    
    return Scaffold(
        appBar: AppBar(
          title: Text('Bebidas.'),
          backgroundColor: Colors.brown,
        ),
        body: GridView.count(
          padding: const EdgeInsets.all(15),
          mainAxisSpacing: 10,
          crossAxisCount: 1,
          childAspectRatio: 2.4,
          children: <Widget>[
            _products.forEach((products _drink) 
              showGrid(
                  child: GestureDetector(
                      onTap: () 
                        Navigator.push(context,
                            MaterialPageRoute(builder: (context) 
                          return productosNuevos();
                        ));
                      ,
                      child: Row(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        mainAxisAlignment: MainAxisAlignment.end,
                        children: <Widget>[
                          Text(
                            "BebidasPH",
                          ),
                          Container(
                            alignment: Alignment.bottomRight,
                            child: Image.asset(
                              "assets/images/cafesitop.png",
                              width: screenSize.width / 2.635,
                            ),
                          ),
                        ],
                      )),
                  text: '');
            )
          ],
        ));
  

我目前正在开发我的第一个移动应用程序(使用 Flutter 和 Dart 开发。),我的应用程序是一个与食品相关的应用程序,其中包含显示产品的菜单。当我尝试制作对象列表(在这种情况下为产品)时,问题就来了,这样我就可以轻松地在屏幕上分配和显示它们的名称/价格和图像,我尝试做的是使用“forEach()”函数它迭代列表中的每个实例,然后我可以使用对象的属性应用一个操作,然后我(理论上)获取该信息并显示它,但我收到此错误消息,显示“此表达式的类型为 'void'所以它的值不能被使用。尝试检查你是否使用了正确的 API;可能有一个函数或调用返回你没想到的 void。还要检查类型参数和变量,它们也可能是 void。 "

如果不使用 for each 函数,我该怎么做?或者如何解决这个问题?

这是给我问题的代码部分:

【问题讨论】:

你能用 code-sn-p 代替 code-image 吗? 【参考方案1】:

当您使用 StatelessWidget 时,放置变量 _product 不会导致任何问题,但是当您想将其设置为 StatefulWidget 时,请将其放在 build 方法之前。

如果你查看forEach 的结构,它是返回 void

void forEach(
   void action(
     E element
   )
)

对于您的情况,您需要 map 列表并返回 Column 使用扩展运算符... 。会是这样的

   Column(
        children: [
          ..._product.map((e) 
            //return your widget
            return Text("");
          ).toList(),
        ],
      ),

为了你的sn-p

children: <Widget>[
            ..._products.map((_drink) 
             return showGrid(
                  child: GestureDetector(
                      onTap: () 
                        Navigator.push(context,
                            MaterialPageRoute(builder: (context) 
                          return productosNuevos();
                        ));
                      ,
                      child: Row(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        mainAxisAlignment: MainAxisAlignment.end,
                        children: <Widget>[
                          Text(
                            "BebidasPH",
                          ),
                          Container(
                            alignment: Alignment.bottomRight,
                            child: Image.asset(
                              "assets/images/cafesitop.png",
                              width: screenSize.width / 2.635,
                            ),
                          ),
                        ],
                      )),
                  text: '');
            ).toList(),
          ],

更多关于spread-operatoron So和Map

【讨论】:

谢谢!抱歉,我无法检索图像的 code-sn-p 插入... 你试过用map作为我的答案吗? 我正在尝试这样做,但是每当我在我的对象列表中插入一些东西时,它就会崩溃,并显示此错误:“RangeError (index): Invalid value: valid value range is empty”我很抱歉,我之前从未使用过 .map 方法,甚至从未使用过传播运算符...

以上是关于如何迭代对象列表并使用颤振在小部件中获取它们的属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 JSON 数据中获取列表以显示在小部件中?

如何从 Firebase Firestore 获取数据并将其存储在列表中以在颤振小部件中使用?

在多个屏幕中使用表单颤振“在小部件树中检测到重复的 GlobalKey”错误

通过 addPostFrameCallback 访问 Flutter Provider 时说小部件在小部件树之外,但颤振检查器显示其他情况

如何使用提供程序包收听更改并在颤振中重建小部件?

Setstate 在小部件列表中不起作用