【问题标题】:Flutter element not appearing when in for loop在 for 循环中不出现颤振元素
【发布时间】:2021-10-13 19:39:47
【问题描述】:

我正在尝试为记录列表中的每个元素创建一个 UI 元素,但没有出现任何内容。我创建了一个类,要求提供名称、日期和描述,我为列表中的每个元素提供它们。

我在 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 还是很陌生,所以如果您需要更多信息,请告诉我 :)

【问题讨论】:

    标签: flutter for-loop dart aws-amplify


    【解决方案1】:

    你的 for 没有返回任何东西,也没有合适的地方从 for 中返回东西。

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

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

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

    在这种情况下,您必须获取每个元素并返回一个使用您的值的 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}',
                );
              })
            ],
          ),
        );
      }
    }
    

    【讨论】:

    • 我很抱歉,但我真的不明白我应该在哪里映射列表以及解构做什么,为什么需要解构它,以及我将如何使用解构列表。
    • 我把整个代码和映射放在了底部。您有一个在整个代码之上解构的示例。它可以用来解构其他的映射和数组,比如大写。如果你想了解更多关于解构的知识,你可以看看这个视频,它是关于 JavaScript 解构的,但在 Dart 中也是一样的。 youtube.com/watch?v=NIq3qLaHCIs
    • 感谢您的解释和视频,但不幸的是,这仍然没有显示任何创建任何 RecordingElement 小部件。
    • 好的,我刚刚解决了这个问题,它是在代码的前面定义了 List 变量。
    • 我明白了,我很高兴听到你解决了它 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 2016-01-26
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    相关资源
    最近更新 更多