在for循环中不出现Flutter元素

Flutter element not appearing when in for loop

我正在尝试为录音列表中的每个元素创建一个 UI 元素,但什么也没有出现。我制作了一个 class,它要求我为列表中的每个元素提供名称、日期和描述。

我在 for 循环之外制作的,测试它是否会绘制任何东西,正在按预期显示。我也知道列表确实包含它需要的元素。

列表中的元素是从 Amplify DataStore 实例加载的,并且正在正确打印到调试控制台。

代码如下:

class BuildRecordingsList extends StatefulWidget {
  const BuildRecordingsList({Key? key}) : super(key: key);

  @override
  _BuildRecordingsListState createState() => _BuildRecordingsListState();
}

class _BuildRecordingsListState extends State<BuildRecordingsList> {
  List<Recording> recordings = DataStoreAppProvider().recordings;

  @override
  Widget build(BuildContext context) {
    DataStoreAppProvider().getRecordings();
    return Container(
      child: Column(
        children: [
          RecordingElement(
              recordingName: 'recordingName',
              recordingDate: TemporalDate.now(),
              recordingDescription: 'recordingDescription'),
          for (var rec in recordings)
            RecordingElement(
              recordingName: '${rec.name}',
              recordingDate: rec.date,
              recordingDescription: '${rec.description}',
            ),
        ],
      ),
    );
  }
}

我对 Flutter 和 Dart 还是很陌生,所以如果您需要更多信息,请告诉我:)

你的 for 没有 return 任何东西,而且没有合适的地方来放置 for 的 return 东西。

您应该检查 Iterable 方法:forEach、map 等...

在这种情况下,您必须使用 map 方法,该方法接受一个数组,并在处理每个元素后 return 另一个数组。

[1, 2, 3].map((index) => index.toString()) // ["1", "2", "3"]

在这种情况下,您必须获取每个元素和 return 使用您的值的 Widget。

...recordings.map((rec) {
  return RecordingElement(
    recordingName: '${rec.name}',
    recordingDate: rec.date,
    recordingDescription: '${rec.description}',
  );
})

当您的 Column 子项接受 List 作为值时,您必须解构您的元素。

正在解构:

List firstList = [1, 2];

列表 secondList = [0, ...firstList]; // [0, 1, 2]

完整代码:

class BuildRecordingsList extends StatefulWidget {
  const BuildRecordingsList({Key? key}) : super(key: key);

  @override
  _BuildRecordingsListState createState() => _BuildRecordingsListState();
}

class _BuildRecordingsListState extends State<BuildRecordingsList> {
  List<Recording> recordings = DataStoreAppProvider().recordings;

  @override
  Widget build(BuildContext context) {
    DataStoreAppProvider().getRecordings();
    return Container(
      child: Column(
        children: [
          RecordingElement(
              recordingName: 'recordingName',
              recordingDate: TemporalDate.now(),
              recordingDescription: 'recordingDescription'),
          ...recordings.map((rec) {
            return RecordingElement(
            recordingName: '${rec.name}',
            recordingDate: rec.date,
            recordingDescription: '${rec.description}',
            );
          })
        ],
      ),
    );
  }
}