【发布时间】:2020-06-23 15:45:11
【问题描述】:
我正在尝试启动“水表”。 当我打开应用程序时,应该生成此值。 我的问题是,当我构建小部件时,它不会呈现实际值。 只有当我转到另一个屏幕或热重载屏幕时,它才会呈现值。 这里我计算并设置State。
var dif = parsedDate.difference(dateNow).inDays;
var difInPercent = double.parse((dif / interval).toStringAsFixed(2));
setState(() {
waterPercentage = difInPercent*100;
});
print(waterPercentage); // for debug purposes
稍后在我的构建方法中,我使用这个变量,我为我的小部件全局定义
Container(
height: waterPercentage,
width: 15,
[...]
显然我做错了什么,因为没有直接设置状态。 运行此集合状态“plantDate()”的函数在另一个小部件中被调用。
Text(
"Next watering: \n${plantDate(widget.plant.date, widget.plant.interval)}",
[...]
有人有想法吗?
编辑:这是完整类https://pastebin.com/N4M55YnA的代码
EDIT2:是那样做的,但不是那样工作的。
@override
initState(){
super.initState();
interval = widget.plant.interval;
parsedDate = DateTime.parse(date);
date = DateFormat.MMMMd().format(parsedDate);
var dateNow = DateTime.now();
var dif = parsedDate.difference(dateNow).inDays;
var difInPercent = double.parse((dif / interval).toStringAsFixed(2));
waterPercentage = difInPercent*100;
}
【问题讨论】:
-
嗨!您能否提供小部件的完整课程的代码。最好能找到问题。
-
顺便说一句,您将
setState部分放在哪里?它位于哪个方法中? -
pastebin.com/N4M55YnA 你去。把它放在 Pastebin 上,因为它有点长
-
我认为你应该在
initState方法中完成这项工作。您只调用该方法一次,这意味着您希望数据只加载一次(即在小部件构建时)。更好的方法是使用initState方法。保持代码不变,直接设置变量,不要使用setState。 -
试一试...如果可行,我会将其发布为答案..