0

我正在尝试启动“水表”。当我打开应用程序时,应该生成此值。我的问题是,当我构建小部件时,它不会呈现实际值。只有当我转到另一个屏幕或热重载屏幕时,它才会呈现值。在这里我计算并设置状态。

    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;
 }
4

1 回答 1

0

更新:现在可以工作了。@Shardul Nalegave 的回答是正确的。我只是在初始化时使用了错误的变量。

  初始化状态(){
    super.initState();


    print("超级初始化状态调用");
    
    间隔=小部件.植物.间隔;
    parsedDate = DateTime.parse(widget.plant.date);
    日期 = DateFormat.MMMMd().format(parsedDate);

    var dateNow = DateTime.now();
    var diff = parsedDate.difference(dateNow).inDays;
    var difInPercent = double.parse((dif / interval).toStringAsFixed(2));
    水百分比 = 差异百分比 * 100;
    //print("水百分比:$水百分比");
    //print("日期:$date");
    //print("解析日期:$parsedDate");
    //print("间隔:$interval");
  }
于 2020-06-23T18:50:00.293 回答