【问题标题】:Flutter - The argument type 'String?' can't be assigned to the parameter type 'String'Flutter - 参数类型“字符串?”不能分配给参数类型“字符串”
【发布时间】:2021-09-04 13:27:44
【问题描述】:

在 Flutter 2.0 引入 null 安全之后,但在获取 String 变量时 Flutter 显示错误 -

参数类型“字符串?”不能赋值给参数类型'String'.dart(argument_type_not_assignable)

我想要一个构造函数,如何实现具有空安全性的构造函数?还有如何获取String变量。

我也用过toString()方法,但不确定是不是正版。

class OnbordingSliderTile extends StatelessWidget {

  final String? title;

  OnbordingSliderTile({this.title});

  @override
  Widget build(BuildContext context) {
    return Container(
      //This Text widget is showing the error
      child: Text(title)
    );
  }
}

【问题讨论】:

  • 使用文本(标题!)而不是文本(标题)

标签: flutter null


【解决方案1】:

类型String? 意味着它必须在这种类型的变量中有一个字符串或空值。在您的情况下,您可能总是需要一个标题,并且此变量不应为空。 所以解决办法是把type改为String,在构造函数的命名参数中加上required关键字。

class OnbordingSliderTile extends StatelessWidget {

final String title;

  OnbordingSliderTile({required this.title});

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Text(title)
    );
  }
}

我也用过 toString() 方法,但不确定是不是正版

如果您在String? 上使用toString(),它将返回值(如果有),或者只是"null" 字符串(如果它为空)。

您得到的错误是由Text 小部件引起的。它知道您正在将可能包含null 的内容显示为文本。

UPD:,请不要遵循以下建议:

使用 Text(title!) 代替 Text(title) – Mehran Ullah

这是一种非常糟糕的做法,破坏了 null 安全性的全部意义。这样做意味着您坚持在可空类型变量中没有空值,这在大多数情况下可以避免并且不安全,因为如果您不为变量提供值可能会导致空错误,这可能会发生由于您使用的命名参数不是必需的,也没有任何初始值,因此您不能在构造函数中将任何内容传递给您的小部件。

UPD

这是推荐的方式吗?因为如果我不希望变量是必需的怎么办? – 用户4258194

Text 小部件需要String。这是一个位置参数,这意味着它是必需的。 Text widget 不能没有文字。

您有哪些选项可以在示例小部件中提供它?

  • 答案开头部分显示的必需参数;

  • 具有初始值的可选不可空参数:

     class OnbordingSliderTile extends StatelessWidget {
    
     final String title;
    
         //'Placeholder text' will be in title variable if you 
         // haven't provided a value for it when initializing OnbordingSliderTile
     OnbordingSliderTile({this.title = 'Placeholder text'});
     @override
     Widget build(BuildContext context) {
     return Container(
       child: Text(title)
       );
      }
     }
    
  • 一个没有初始值的可空参数,在文本小部件中使用它时进行空检查:

     class OnbordingSliderTile extends StatelessWidget {
    
     final String? title;
    
         //you can skip providing this parameter to the constructor and then it will be null
    
     OnbordingSliderTile({this.title});
     @override
     Widget build(BuildContext context) {
     return Container(
     // You have to check if value in your variable is a String, not null
     // and make sure you provided some text for the case if it null
        child: Text(title ?? 'Placeholder text')
       );
      }
     }
    

如果您在未提供值时需要此文本为空,请在任何提供的选项中使用空字符串作为占位符文本。

【讨论】:

  • 这是推荐的方式吗?因为如果我不希望变量是必需的怎么办?
猜你喜欢
  • 2021-10-21
  • 2021-10-13
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2020-08-25
相关资源
最近更新 更多