颤振 - 参数类型"字符串?"不能分配给参数类型"字符串"



Flutter 2.0引入零安全后,但在获取字符串变量时,Flutter显示错误-

参数类型"String?"无法分配给参数类型"String"。dart(argument_type_not_assignable(

我想有一个构造函数,如何实现具有Null安全性的构造函数?以及如何获取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)
);
}
}

类型String?意味着它必须在该类型的变量中具有字符串或null。在您的情况下,可能总是需要一个标题,而这个变量不应该为null。因此,解决方案是将类型更改为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"字符串(如果为null(。

您得到的错误是由Text小部件引起的。它提醒您,您正在以文本形式显示可能包含null的内容。

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

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

这是一种非常糟糕的做法,破坏了零安全的全部要点。这样做意味着你坚持在一个可为null的类型变量中不存在null值,这在大多数情况下是可以避免的,而且是不安全的,因为如果你没有为变量提供值,你可能会导致null错误,这可能是因为你使用的命名参数不是必需的,也没有任何初始值,所以你不能在构造函数中向你的小部件传递任何东西。

UPD

这是推荐的方式吗?因为如果我不希望变量是必需的,该怎么办user4258194

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

在示例小部件中提供它的选项是什么?

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

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

    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)
    );
    }
    }
    
  • 一个可以为null的参数,没有初始值,在Text窗口小部件中使用时进行null检查:

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

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

相关内容

  • 没有找到相关文章

最新更新