【问题标题】:dart says "non-nullable variable must be initialized before use", even after assigning with if, else blockdart 说“不可为空的变量必须在使用前初始化”,即使在使用 if 分配之后,else 块
【发布时间】:2023-03-31 23:39:01
【问题描述】:

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

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

错误:

不可为空的局部变量 'dateToday' 必须在它之前赋值 可以使用。尝试给它一个初始化表达式,或确保 它分配在每个执行路径上。

【问题讨论】:

    标签: flutter dart scope


    【解决方案1】:

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

    试试这个

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

    【讨论】:

    • 这行得通。即使没有 late 关键字。
    • 你能解释一下为什么不应该在这里使用 final 吗?既然值以后不会改变,为什么不使用它。
    • 当您在那里使用 final 时,您将在 if 和 else 范围内声明新变量,哪种类型自动是动态的。因此不会分配您的初始 dateToday 变量。当您尝试从 if 和 else 语句之外读取它时,您指的是未分配的 String dateToday 变量。因此 dart 抱怨你没有在使用前分配变量。
    【解决方案2】:

    我相信你用错了。您必须将值设置为已定义的变量。换句话说,在这种情况下不要使用 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。
    • 你能解释一下为什么不应该在这里使用 final 吗?既然值之后不会改变,为什么不使用它。 Flutter 喜欢尽可能使用 final。
    • 根据 Dart 文档,final 关键字用于硬编码变量的值,以后不能更改,对这些变量执行的任何操作都不能更改其值(状态)。此外,如果您想为任何变量设置值,您必须先声明该变量。您已经在 if 条件之前声明了变量。这意味着在这种情况下你不能使用 final 关键字@VaisakMohan
    猜你喜欢
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 2011-12-08
    • 1970-01-01
    • 2020-01-20
    • 2012-01-16
    • 2014-03-01
    相关资源
    最近更新 更多