繁体   English   中英

Flutter / Dart:地图列表与小部件列表? 哪个更好?

[英]Flutter / Dart : List of maps vs List of Widgets? Which is better?

我正在创建一种“交互式字典”。 显然,字典将由 WORDS(作为条目)组成。 所以我定义了“单词”是什么:一系列元素:一个主要的英语单词、一个同义词列表、一个反义词列表、法语翻译等......

到目前为止,我已经创建了一个包含所有这些字段的“WORD WIDGET”。 因此,我的 wordBank 列表将包含一个“单词小部件列表”。

我想知道这是否是一种组织数据的好方法,如果一个 MAPS 列表会更好? 使用列表、排序、获取元素等时性能会有所不同吗?

这是我构建它的方式:

enum Nature {
  nom_masc,
  nom_fem,
  adjectif,
  adverbe,
  verbe,
  verbe_irr,
  preposition,
}

class Word {
  final int id;
  final Nature nature;
  final String theme;
  final List<String> french; // the first element is the primary word
  final List<String> english; // the first element is the primary word
  final String image;
  final String sound; // to be used as label2 in case of input type question
  final String wDef; // a written definion of the main word
  final String oDef; // an oral definition of the main word
  final String phon; // a phonetic transcription of the word

  Word({
    @required this.id,
    @required this.nature,
    @required this.theme,
    @required this.french,
    @required this.english,
    this.image,
    this.sound,
    this.wDef,
    this.oDef,
    this.phon,
  });
}
```

总是更喜欢核心数据列表而不是 UI 小部件列表。 有很多优点:

  1. 保持后端和前端分离始终是一个好习惯。

  2. 保留地图列表将帮助您在应用程序的任何位置重复使用该列表中的数据。 就像说您想制作另一个相同数据的列表但小部件设计会有所不同,或者您可能只想显示 map 中的一些数据,这些条件可以通过 Map 列表而不是小部件列表轻松满足.

  3. 比较每个的数据类型。 Map 类型的 object 将占用更少的空间,因为它只包含数据。 但另一方面,一个 Widget 的 object 将占用大量空间,具体取决于小部件树的深度和子小部件。

  4. 如果您保留地图列表,则可以轻松自定义生成的列表视图。 在显示 ListView 时说,您希望根据同一页面上存在的其他一些数据为子小部件提供不同的颜色。 使用 Map 列表执行起来会容易得多。

还有更多优点,而且它使代码保持干净且易于管理。

根据我从您的描述中了解到的情况,有几件事值得一提:

  1. 没有小部件列表,而是有任何数据结构来存储数据(列表,Map 任何东西都取决于用例)并将其包装到小部件中,同时向用户显示它们。

  2. 现在要根据您的用例存储此数据,使用 map 可能是有益的,因为当您在字典中查询所需的任何单词时,它可以减少搜索时间,只有一个具有特定拼写的唯一单词。 当您对存储在其中的数据没有任何特殊条件(如此处的字典)时,列表适用于存储任何数据,因此每次搜索元素时都会执行线性搜索。

因此,您可以拥有一个字(字符串)到字 object 的 map 并根据您想要的字,您可以查询 map,检索数据并将数据包装到 WordWidget 中同时显示。

此外,作为软件开发中的一般做法,我们尝试使事物尽可能松散地解耦。 因此,提供数据的层(或数据结构)应该仅用于此目的,而接收数据并将其包装到 UI 元素中的层应该是分开的。 这样,您的代码也可以根据任何未来的用例进行维护和扩展。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM