我的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}');
1条答案
按热度按时间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
之前,请始终检查此布尔值。在我的经验中,这种延迟初始化的问题经常发生,虽然它们可以工作,但我对上面的任何一个解决方案都不是很满意。我很高兴有更好的主意!