Nullaware 运算符似乎不能在文本小部件内工作?

Nullaware operator doesn't seem to work inside a Text widget?

我有简单的代码如下:

  class TestPage extends StatelessWidget {
  static String myString = 'abc';
  static double myDouble;

  @override
  Widget build(BuildContext context) {
    try {
      myDouble = double.parse(myString) + 5;
    } catch (e) {
      print(e);
    }
    return Scaffold(
      body: Center(
        child: Text(
          '$myDouble' ?? 'Ok',
          style: TextStyle(fontSize: 50),
        ),
      ),
    );
  }
}

由于 myDouble 将 return 为空,我希望 Text 小部件接受 'Ok' 并呈现相同的内容。但是,我仍然在屏幕上看到 null。

请提供有关为什么这不起作用的任何帮助。谢谢。

此外,我不明白为什么我不能在构建方法之前使用 try catch 块,因为它会出错。

免责声明:这个问题是关于 null-safety 之前的 Dart。启用空值安全,这种情况就不会发生。

在您的情况下,即使 myDouble 为空,当您执行

'$variable' 

您正在创建一个 new 字符串,它不是空的(由 "' 符号表示)。

因此永远不会调用 null 感知运算符之后的 'ok'。 此外,在字符串中使用 ${var} 称为 String Interpolation,如文档所述:

To get the string corresponding to an object, Dart calls the object’s toString() method.

并且,空对象 returns 上的 toString() 方法只是 null,这会导致您的文本显示空。

想要的结果有很多种方法,你可以这样做,举个例子:

(myDouble == null) ?  'ok' : '$myDouble' ,

作为提醒,Dart now supports null safety,您应该在新代码中使用它(并迁移旧代码)。有了 null safety,您之前可能会注意到这个错误。

Text('$myDouble') 将 null 转换为字符串 null

'$myDouble' is now 'null'(string)

要管理 null String 变量,您可以通过以下任一方式执行此操作

Text(myDouble == null ? 'Ok' : myDouble.toString);