Dart Null 安全:无法无条件调用方法“[]”,因为接收者可以为“null”

时间:2021-07-08 13:14:32

标签: flutter dart dart-null-safety

我的 Flutter 应用程序中有以下 Text( ... ) 小部件

Text(
                                    data['location'],
                                    style: TextStyle(
                                        fontSize: 40, 
                                        letterSpacing: 2, 
                                        color: Colors.white
                                    )

但是,它不断向我显示无法访问 data['location'] 的错误,因为它可以为 null。我想这与 Dart 的 null 安全检查有关

我的代码流程是这样的:

  1. 我在 Text( ... ) 小部件中访问的数据对象在上面声明如下:

     Object? data;
    
  2. 之后,当我从另一个屏幕向这个屏幕传递数据时,我使用上面声明的数据对象并执行以下赋值:

         data = ModalRoute.of(context)!.settings.arguments;
    
  3. 最后,我在 Text( ... ) 小部件中访问此数据对象

我应该怎么做才能避免这个错误?

2 个答案:

答案 0 :(得分:0)

1 - data 属于 Object 类型,因此您不能将 []Object 类型一起使用,因为它不会重载 [] 运算符

2 - 假设参数的类型为 List,您必须先将其强制转换为 Map,然后像这样访问数据

 (data as Map?)?["location"]

3 - data 是可空类型 你需要做的就是告诉 dart 我确信 data 不是空的 bang 运算符

结局代码应该是这样的:

Text(
  (data as Map?)?["location"]!, // <---
  style: TextStyle(
  fontSize: 40, 
  letterSpacing: 2, 
  color: Colors.white
)

答案 1 :(得分:0)

arguments 属性的返回类型为 Object?,这是最通用的类​​型。

要使用实际数据,您首先需要使用 Typecast as 运算符。

var data = ModalRoute.of(context)?.settings.arguments as Map<String, dynamic>?;

因为 data 可以为 null

  1. 您需要设置一个默认值,例如:
data ??= {'location': 'behind you'}; // Avoids null access.
  1. 或者如果您绝对确定该值不会为空:
data!['location']; // Will result in runtime exception if data is null.