如何在 flutter 中循环函数的某些部分?

How to loop somepart of function in flutter?

提问人:suns 提问时间:9/7/2023 最后编辑:suns 更新时间:9/7/2023 访问量:38

问:

我想根据 widget.menuItem.category.length 循环函数的某些部分,我是 flutter 的新手。 这是我目前的代码:

_buildContentView({BuildContext context}) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.stretch,
      children: <Widget>[
        _buildMenuItemImage(),
        Container(
          child: Text(widget.menuItem.name,
              style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
          padding: EdgeInsets.only(left: 16, right: 16, top: 12, bottom: 8),
        ),
        Container(
          child: Text(widget.menuItem.itemDescription,
              style: TextStyle(fontSize: 18, fontWeight: FontWeight.normal)),
          padding: EdgeInsets.only(left: 16, right: 16, top: 12, bottom: 8),
        ),
        Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: <Widget>[
            Container(
              child: Text('Select ' + widget.menuItem.category[0]),
              padding: EdgeInsets.only(left: 16, right: 16, top: 8, bottom: 6),
            ),
            Container(
              child: Text('Select ' +
                  _qty.toString() +
                  ' item (' +
                  _qty.toString() +
                  '/' +
                  widget.menuItem.setMenuItems.length.toString() +
                  ')'),
              padding: EdgeInsets.only(left: 16, right: 16, top: 8, bottom: 6),
            ),
          ],
        ),
        _buildSetMenusView(setMenuItems: widget.menuItem.setMenuItems),
        Padding(
          padding: EdgeInsets.only(left: 12, right: 12, top: 8, bottom: 12),
          child: _buildActionButtons(context: context),
        )
      ],
    );
  }

我想循环这部分:

Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: <Widget>[
            Container(
              child: Text('Select ' + widget.menuItem.category[0]),
              padding: EdgeInsets.only(left: 16, right: 16, top: 8, bottom: 6),
            ),
            Container(
              child: Text('Select ' +
                  _qty.toString() +
                  ' item (' +
                  _qty.toString() +
                  '/' +
                  widget.menuItem.setMenuItems.length.toString() +
                  ')'),
              padding: EdgeInsets.only(left: 16, right: 16, top: 8, bottom: 6),
            ),
          ],
        ),
        _buildSetMenusView(setMenuItems: widget.menuItem.setMenuItems),

我尝试使用此代码但失败了,它没有显示在模拟器上(空白):

for(var i = 0; i < widget.menuItem.category.length; i++){
        Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: <Widget>[
            Container(
              child: Text('Select ' + widget.menuItem.category[i]),
              padding: EdgeInsets.only(left: 16, right: 16, top: 8, bottom: 6),
            ),
            Container(
              child: Text('Select ' +
                  _qty.toString() +
                  ' item (' +
                  _qty.toString() +
                  '/' +
                  widget.menuItem.setMenuItems.length.toString() +
                  ')'),
              padding: EdgeInsets.only(left: 16, right: 16, top: 8, bottom: 6),
            ),
          ],
        ),
        _buildSetMenusView(setMenuItems: widget.menuItem.setMenuItems),
}

在 flutter 中循环这部分的正确代码是什么?请帮我修复这个 flutter 循环代码

flutter 函数 循环 for-loop

评论

0赞 Md. Yeasin Sheikh 9/7/2023
如果它大于 0,请尝试调试/打印widget.menuItem.category.length
0赞 suns 9/7/2023
是的,它大于 0
0赞 Md. Yeasin Sheikh 9/7/2023
你喜欢在列内循环吗?
0赞 suns 9/7/2023
因为我只需要循环播放列的某些部分
0赞 Md. Yeasin Sheikh 9/7/2023
好的,你可以像我发布的那样使用spred运算符。(它没有 on for 循环){..}

答:

0赞 SaifAlmajd 9/7/2023 #1

如果我做对了,那么你必须在 Flutter 中包装一个小部件,你需要遵循几个步骤。 当您有大量子小部件并且想要按需构建它们时,这是一个不错的选择,因为它有助于性能优化。以下是将小部件包装在以下内容中的方法:ListView.builderListView.builderListView.builder

  1. 导入颤振材质:首先,确保你已经在 Dart 文件中导入了必要的 Flutter 材料库。
import 'package:flutter/material.dart';
  1. 创建一个 ListView.builder:定义小部件。此小组件采用一个构建器函数,该函数根据索引动态生成列表项。ListView.builder
ListView.builder(
  itemCount: itemCount, // Replace itemCount with the actual number of items you have.
  itemBuilder: (BuildContext context, int index) {
    // Here, you can return a widget for each list item based on the index.
    return YourListItemWidget(index); // Replace YourListItemWidget with your custom widget.
  },
)
  1. 创建自定义列表项小组件:您需要为列表中的每个项目创建一个自定义小部件。您可以在此处定义列表项的布局和设计。
class YourListItemWidget extends StatelessWidget {
  final int index;

  YourListItemWidget(this.index);

  @override
  Widget build(BuildContext context) {
    return ListTile(
      title: Text('Item $index'), // Customize this based on your data.
      // Add other widgets and styling as needed.
    );
  }
}
  1. 将 'itemCount' 和 'YourListItemWidget' 替换为您的数据:在 中,替换为列表中的实际项数,并替换为自定义列表项小组件。ListView.builderitemCountYourListItemWidget

  2. 显示 ListView.builder:最后,将 your 添加到 Flutter 应用相应部分的小部件树中。ListView.builder

下面是一个完整的示例:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('ListView.builder Example'),
        ),
        body: MyListView(),
      ),
    );
  }
}

class MyListView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      itemCount: 20, // Replace with the actual number of items.
      itemBuilder: (BuildContext context, int index) {
        return YourListItemWidget(index); // Replace with your custom widget.
      },
    );
  }
}

class YourListItemWidget extends StatelessWidget {
  final int index;

  YourListItemWidget(this.index);

  @override
  Widget build(BuildContext context) {
    return ListTile(
      title: Text('Item $index'), // Customize this based on your data.
      // Add other widgets and styling as needed.
    );
  }
}

根据需要将 和 的内容替换为您的实际数据和自定义小部件。这将允许你在 Flutter 中有效地创建一个可滚动的项目列表。itemCountYourListItemWidgetListView.builder

0赞 Md. Yeasin Sheikh 9/7/2023 #2

当您在 Column 内部查看并希望返回多个小部件时,您可以使用 spreed 运算符。

for(var i = 0; i < widget.menuItem.category.length; i++)
  ...[
      Row(),
      _buildSetMenusView()
     ], 

您也可以返回另一个列。

0赞 Azad Hossain 9/7/2023 #3

若要根据 widget.menuItem.category 长度循环访问函数的一部分,可以使用 ListView.builder 或带有循环的 Column。以下是使用列执行此操作的方法:

_buildContentView(BuildContext context) {
  List<Widget> rows = [];

  for (var i = 0; i < widget.menuItem.category.length; i++) {
    rows.add(
      Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: <Widget>[
          Container(
            child: Text('Select ' + widget.menuItem.category[i]),
            padding: EdgeInsets.only(left: 16, right: 16, top: 8, bottom: 6),
          ),
          Container(
            child: Text('Select ' +
                _qty.toString() +
                ' item (' +
                _qty.toString() +
                '/' +
                widget.menuItem.setMenuItems.length.toString() +
                ')'),
            padding: EdgeInsets.only(left: 16, right: 16, top: 8, bottom: 6),
          ),
        ],
      ),
    );
    rows.add(_buildSetMenusView(setMenuItems: widget.menuItem.setMenuItems));
  }

  return Column(
    crossAxisAlignment: CrossAxisAlignment.stretch,
    children: <Widget>[
      _buildMenuItemImage(),
      Container(
        child: Text(widget.menuItem.name,
            style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
        padding: EdgeInsets.only(left: 16, right: 16, top: 12, bottom: 8),
      ),
      Container(
        child: Text(widget.menuItem.itemDescription,
            style: TextStyle(fontSize: 18, fontWeight: FontWeight.normal)),
        padding: EdgeInsets.only(left: 16, right: 16, top: 12, bottom: 8),
      ),
      ...rows, // Use the spread operator to add the list of rows
      Padding(
        padding: EdgeInsets.only(left: 12, right: 12, top: 8, bottom: 12),
        child: _buildActionButtons(context: context),
      )
    ],
  );
}