Flutter - 参数类型“字符串?”不能分配给参数类型“字符串”

时间:2021-06-20 17:22:00

标签: flutter null

Flutter 2.0 引入空安全后,Flutter 获取 String 变量时却显示错误 -

<块引用>

参数类型“字符串?”无法分配给参数类型 '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)
    );
  }
}

1 个答案:

答案 0 :(得分:1)

Type String? 表示该类型的变量中必须有字符串或空值。在您的情况下,您可能总是需要一个标题,并且此变量不应为空。 所以解决方案是将类型改为String,并在构造函数中的命名参数中添加required关键字。

class OnbordingSliderTile extends StatelessWidget {

final String title;

  OnbordingSliderTile({required this.title});

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Text(title)
    );
  }
}
<块引用>

我也使用过 toString() 方法,但不确定它是否是真正的方法

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

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

UPD:并且请不要遵循以下建议:

<块引用>

使用 Text(title!) 而不是 Text(title) – Mehran Ullah

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

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')
       );
      }
     }
    

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