提问人:suns 提问时间:9/7/2023 最后编辑:suns 更新时间:9/7/2023 访问量:38
如何在 flutter 中循环函数的某些部分?
How to loop somepart of function in flutter?
问:
我想根据 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 中包装一个小部件,你需要遵循几个步骤。 当您有大量子小部件并且想要按需构建它们时,这是一个不错的选择,因为它有助于性能优化。以下是将小部件包装在以下内容中的方法:ListView.builder
ListView.builder
ListView.builder
- 导入颤振材质:首先,确保你已经在 Dart 文件中导入了必要的 Flutter 材料库。
import 'package:flutter/material.dart';
- 创建一个 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.
},
)
- 创建自定义列表项小组件:您需要为列表中的每个项目创建一个自定义小部件。您可以在此处定义列表项的布局和设计。
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.
);
}
}
将 'itemCount' 和 'YourListItemWidget' 替换为您的数据:在 中,替换为列表中的实际项数,并替换为自定义列表项小组件。
ListView.builder
itemCount
YourListItemWidget
显示 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 中有效地创建一个可滚动的项目列表。itemCount
YourListItemWidget
ListView.builder
当您在 Column 内部查看并希望返回多个小部件时,您可以使用 spreed 运算符。
for(var i = 0; i < widget.menuItem.category.length; i++)
...[
Row(),
_buildSetMenusView()
],
您也可以返回另一个列。
若要根据 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),
)
],
);
}
评论
widget.menuItem.category.length
{..}