在 FLUTTER/DART 中,为啥我们有时在声明变量的时候会在“String”后面加上问号?

Posted

技术标签:

【中文标题】在 FLUTTER/DART 中,为啥我们有时在声明变量的时候会在“String”后面加上问号?【英文标题】:In FLUTTER / DART, why do we sometimes add a question mark to "String" when declaring a variable?在 FLUTTER/DART 中,为什么我们有时在声明变量的时候会在“String”后面加上问号? 【发布时间】:2021-06-25 19:51:54 【问题描述】:

在演示应用中,我们找到了一个“final String?title;”的实例 -> 为什么要添加这个“?”在字符串类型之后?

class MyHomePage extends StatefulWidget 
  MyHomePage(Key? key, this.title) : super(key: key);

  **final String? title;**

  @override
  _MyHomePageState createState() => _MyHomePageState();

同理,为什么在使用的时候,我们要加一个“!” ?

return Scaffold(
      appBar: AppBar(
        // Here we take the value from the MyHomePage object that was created by
        // the App.build method, and use it to set our appbar title.
        title: **Text(widget.title!),**
      ),
      body: Center(

【问题讨论】:

dart.dev/null-safety/understanding-null-safety 【参考方案1】:

这是 null 安全的,问号表示这个 String? 可能为 null,flutter 将允许您将 null 分配给它。 String 不能为空,编译前会报错。

如果您定义了一个变量String? name,并且您想稍后在文本小部件中使用它,您将收到错误消息。因为 Text 小部件只接受不可为空的类型。但是如果你确定name 永远不会为空,你告诉flutter 不要担心它并且你知道你在做什么,你可以通过添加! 来做到这一点:Text(name!)

【讨论】:

我想知道它是否与空安全性有关。非常感谢您的快速回答。怎么样呢 ”!”在“文本(WIDGET.TITLE!)? 我编辑了我的答案,相信我回答了你关于!的第二个问题。 它与空安全有关,它是在空安全中编写飞镖。您应该检查并阅读它,它将使您的代码更快、更小并且不易出错。 非常感谢您的回答。非常清楚!您可能已经猜到了,我是 Flutter 开发的初学者。但爱它! :) 想知道是否可以在 Stack Overflow 中创建开发人员的“虚拟团队”,以便像我这样的初学者可以与更多“高级”开发人员分享?【参考方案2】:

variable_type ? name_of_variable; 表示 name_of_variable 可以为空。

variable_type name_of_variable1; 表示 name_of_variable1 不能为空,应立即初始化。

late variable_type name_of_variable2;表示name_of_variable2不能为空,可以稍后初始化。

late variable_type name_of_variable3;
variable_type ? name_of_variable4;
name_of_variable4=some_data;
name_of_variable3=name_of_variable4!;// name_of_variable4! means that you are sure 100% it never will be null

int类型的实例:

int ? a=null; // OK
int  b=null; // b cannot be equal null
late int c =null; // c cannot be equal null
late int d;
d=5; //OK

late int d; // if you never initialize it, you ll got exception

int e=5;
int? f=4;
int ? z;
e=f!; // OK, You are sure that f never are null

e=z!;// You get exception because z is equal null

【讨论】:

感谢您的解释!很有帮助。 你的例子中的“迟到”是什么意思?

以上是关于在 FLUTTER/DART 中,为啥我们有时在声明变量的时候会在“String”后面加上问号?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter/Dart 中处理应用程序卸载?

我们如何在 Flutter/Dart 中将自定义 DateTime 格式化为 DateTime?

为啥我的 Contact.dart 没有运行? (颤振、飞镖、VS 代码)

Flutter/Dart 中的 extension 方法

Flutter Dart:模型类字段内的动态关系

离不开DART的Flutter(dart篇)