dart 说 "non-nullable variable must be initialized before use",即使在用 if 赋值后,else 块

dart says "non-nullable variable must be initialized before use", even after assigning with if, else block

正在尝试这样做。如果我可以避免在这两种情况下实现完整代码,那就太好了。

  String dateToday;
  //if time is past 6pm, get next date:
  if (fetchTime.hour > 18){
    final dateToday = DateFormat('dd-MM-yyyy').format(fetchTime.add(Duration(days: 1)));
  }
  else{
    final dateToday = DateFormat('dd-MM-yyyy').format(fetchTime);
  }

  final Map<String, String> params = {
      'district_id': '$districtId',
      'date': dateToday                //ERROR HERE  <------
  }

错误:

The non-nullable local variable 'dateToday' must be assigned before it can be used. Try giving it an initializer expression, or ensure that it's assigned on every execution path.

我相信你用错了。您必须将值设置为已定义的变量。换句话说,在这种情况下不要使用 final 关键字。

  String dateToday;   //if time is past 6pm, get next date:   
  if (fetchTime.hour > 18){
    dateToday = DateFormat('dd-MM-yyyy').format(fetchTime.add(Duration(days: 1)));   
  } else{
    dateToday = DateFormat('dd-MM-yyyy').format(fetchTime);   
  }

  final Map<String, String> params = {
      'district_id': '$districtId',
      'date': dateToday    }

根据作者的评论更新,由 OP 添加:

声明变量时应使用 final 关键字。 由于 dateToday 已经声明,在范围内使用 final 会创建一个新的局部变量 dateToday,而外部 dateToday 保持未分配状态。

当你在那里使用 final 时,你在 if 和 else 范围内声明了新变量,类型自动是动态的。因此您的初始 dateToday 变量将不会被分配。当您尝试从 if 和 else 语句外部读取它时,您指的是未分配的 String dateToday 变量。因此飞镖抱怨你没有在使用前分配变量。

试试这个

 late String dateToday;
      //if time is past 6pm, get next date:
      if (fetchTime.hour > 18){
        dateToday = DateFormat('dd-MM-yyyy').format(fetchTime.add(Duration(days: 1)));
      }
      else{
        dateToday = DateFormat('dd-MM-yyyy').format(fetchTime);
      }
    
      final Map<String, String> params = {
          'district_id': '$districtId',
          'date': dateToday                //ERROR HERE  <------
      }