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

Dart Null Safety: The method '[]' can't be unconditionally invoked because the receiver can be 'null'

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

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

但是,它一直向我显示无法访问数据['location'] 的错误,因为它可能为空。我猜它与 Dart 的空安全检查有关

我的代码流程是这样的:

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

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

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

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

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

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

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

3 - data 可以为空类型 您需要做的就是告诉 dart 我确定 data 不为 null 通过 bang operator

结局代码应该是这样的:

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

arguments 属性 有一个 return 类型 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.