【问题标题】:Nullaware operator doesn't seem to work inside a Text widget?Nullaware 运算符似乎在 Text 小部件中不起作用?
【发布时间】:2021-06-25 11:50:53
【问题描述】:

我有简单的代码如下:

  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 将返回null,我希望Text 小部件接收'Ok' 并呈现相同的内容。但是,我仍然看到屏幕上显示 null。

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

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

【问题讨论】:

    标签: flutter dart nullable


    【解决方案1】:

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

    在你的情况下,即使 myDouble 为空,当你这样做时

    '$variable' 
    

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

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

    为了得到一个对象对应的字符串,Dart 调用了对象的 toString() 方法。

    而且,空对象上的toString() 方法只返回null,这会导致您的文本显示为空。

    有很多方法可以达到预期的效果,你可以这样做,例如:

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

    提醒一下,Dart now supports null safety,您应该在新代码(以及迁移旧代码)中使用它。使用 null 安全性,您之前可能会注意到此错误。

    【讨论】:

    • @MartinBackasch 你是对的!谢谢你的留言:)这是一个错误。
    • 感谢您的回复。实际上我正在使用支持空安全的最新 dart sdk 版本。但除此之外,我知道 '$' 返回空字符串,而 .toString 也返回空字符串。
    【解决方案2】:

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

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

    要管理空字符串变量,您可以通过任何一种方式进行操作

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多