【问题标题】:Dart Null Safety: The method '[]' can't be unconditionally invoked because the receiver can be 'null'Dart Null 安全性:无法无条件调用方法“[]”,因为接收者可以为“null”
【发布时间】:2021-09-18 23:07:19
【问题描述】:

我的 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( ... ) 小部件中访问此数据对象

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

【问题讨论】:

  • 您需要先设置ModalRoute.of(context)的值以防null。 ModalRoute.of(context) == null ? defaultData : ModalRoute.of(context).settings.arguments;或者,如果您对 data 没问题,请使用 data = ModalRoute.of(context)?.settings.arguments;
  • @SimonSot 问题仍然存在。它仍然给出相同的错误

标签: flutter dart dart-null-safety


【解决方案1】:

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
)

【讨论】:

  • 谢谢@Hosam。像魅力一样工作。我确实有一个问题:当我删除 (data as Map?)?["location"]! 中的两个问号时,它仍然可以正常工作。这可能是什么原因?
  • 在没有错误的情况下将可空类型转换为不可空类型很奇怪,我认为一些空安全功能还没有完成。看这里cast_nullable_to_non_nullable
【解决方案2】:

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

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

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

因为data 可能为空

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

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 2021-08-10
    • 2021-09-16
    • 2023-04-10
    • 1970-01-01
    • 2021-09-05
    相关资源
    最近更新 更多