【问题标题】:Why do we need to add late modifier while declaring the variables?为什么我们需要在声明变量时添加late修饰符?
【发布时间】:2021-10-28 02:45:00
【问题描述】:

这是一个普遍的问题。与编码无关。在我关注颤振教程的任何地方,我都会看到简单的变量声明。但是当我编写相同的代码时(我认为是因为更新),它需要添加后期修饰符。 late modifier can be used while declaring a non-nullable variable that's initialized after its declaration. Declaration of variables that will be initialize later is done using late modifier. 这是我在谷歌上读到的。 为什么有必要声明不可为空的变量。 Vscode 总是在显示错误的变量下划线。但是吃了修饰符。当我们将变量更改为后期时,我们需要更改什么。导致其制作以下教程非常困难。设置状态没有帮助。

【问题讨论】:

    标签: flutter dart dart-null-safety


    【解决方案1】:

    这是因为 Dart 中的 null 安全性。在引入 null 安全性之前,已经编写了很多指南。 可以使用? 将类成员声明为可为空,因此这是有效的,并且意味着i 可以具有值null,因此无需初始化其值即可:

    int? i;
    

    如果你不使用?,你仍然可以声明一个成员,但你必须给它赋值,这也是有效的:

    int i=1;
    

    但这将是无效的,因为您说i不能为空,并且您没有为其赋值:

    int i;
    

    这里出现了late 关键字。通过使用它,您“承诺” Dart,稍后您将初始化此值,例如在 initState 方法中,如下所示:

    class MyWidget extends StatefulWidget {
      const MyProfile({Key? key}) : super(key: key);
      @override
      _MyWidgetState createState() => _MyWidgetState();
    }
    class _MyWidgetState extends State<MyWidget> {
      late int _i;
    
      @override
      void initState() {
        super.initState();
        _i = 1;
      }
    

    你必须遵守这个“承诺”,否则你会得到一个运行时错误。

    另一种选择是为具有required 成员的类创建一个构造函数,它将确保这些值在创建的任何实例中都不会丢失,因此 Dart 可以接受:

    class MyClass {
        int i;
        MyClass({required this.i});
    }
    

    在最后一个例子中,如果你省略了required 关键字,你会得到一个错误,因为i 不能为空,如果构造函数不需要它,它可能是空的。尽管如此,如果您通过像 int? i; 一样声明 i 使 i 可以为空,它仍然可以在没有 required 的情况下工作。

    【讨论】:

      【解决方案2】:

      late 修饰符是 dart 新的 null-safety 的一部分,它用于告诉编译器将此变量视为不可为空,并且稍后将在没有它的情况下初始化,编译器会将变量视为可空并给出错误

      late String name;
      
      @override
        void initState() {
         
          super.initState();
          name = "example";//the compiler will not see this to know that you have initialized the variable
        }
        @override
        Widget build(BuildContext context) {
      
          if(name=="example"){
      
            ...
          }
        }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-20
        • 1970-01-01
        • 1970-01-01
        • 2021-12-21
        相关资源
        最近更新 更多