Flutter:我的对象列表在代码中填充得太晚,因此Flutter抱怨必须列表为空

dz6r00yl  于 2023-05-19  发布在  Flutter
关注(0)|答案(1)|浏览(204)

我的initstate调用readFile(),它填充了我的静态候选列表。
错误:
========小部件库捕获到异常>===========================================================================================================================================================================================================================================_ExamplePageState#77dfc):Assert失败:file:///C:/Users/User/StudioProjects/flutter_card_swiper-> main/lib/src/card_swiper. dart:164:11 numberOfCardsDisplayed>= 1 && numberOfCardsDisplayed <= cardsCount "您必须显示至少一张卡片,且不超过[cardsCount]"
但是在控制台的底部,我的日志消息显示:[log] static obj len 10
所以我的文件正在被读取,对象正在被添加到静态列表中,但它只在显示错误消息之前被计数。

final cards = ExampleCandidateModel.candidates
      .map((candidate) => ExampleCard(candidate))
      .toList();

  @override
  void initState() {
    var f = ReadFile();
    f.readFile();
  }

  void readFile() async {

    final data = await rootBundle.loadString('assets/qa_list.txt');

    final lines = const LineSplitter().convert(data);

    for (final line in lines) {
     // dev.log(' line : $line');
      final words = line.split('*');
     // dev.log('w1: ${words[0]} w2: ${words[1]} w3: ${words[2]}');
      final q = ExampleCandidateModel(
        index: int.parse(words[0].trim()),
        message: words[1].trim(),
        color: getColors(words[2].trim()),
      );
      ExampleCandidateModel.candidates.add(q);
     // dev.log('Cand object: ${q.index} + ${q.message} + ${q.color}');
edqdpe6u

edqdpe6u1#

cards在**initState之前计算,假设ExampleCandidateModel.candidates为空。在initState之后,它填充了一些项目,但这不再影响cards
如果您确定不会在initState之前的任何地方使用cards(例如,如果您只在build中使用它就可以了),那么您可以使用final late(或late final?不记得了,但是错误的顺序可能会给予你一个语法错误XD),并将initState中的实际定义移到你的初始化逻辑之后。
再一看,我意识到上面的简单解决方案可能不起作用,因为你的初始化函数的大部分是异步的。你可以做的是使card不是final,在初始化后更新它(记住使用setState),如果card为空,则在构建检查中进行更新。如果为空,则可以显示空字符串或提示消息。
最后,如果你真的想让它成为最终的,那么你可以继续使用final late的解决方案,但引入另一个布尔变量(* 例如 * isCardInitialised),在初始化card后将其设置为true。在build中,在尝试访问card之前,请始终检查此布尔值。
在我的经验中,这种延迟初始化的问题经常发生,虽然它们可以工作,但我对上面的任何一个解决方案都不是很满意。我很高兴有更好的主意!

相关问题