错误:无法无条件调用“split”,因为接收器可以为“null”

时间:2021-05-30 12:31:41

标签: flutter dart dart-null-safety

Android Studio 在 Flutter 中的 split 上引发了以下 NullSafety 错误。

The method 'split' can't be unconditionally invoked because the receiver can be 'null'.  Try making the call conditional (using '?.') or adding a null check to the target ('!'). Open documentation 

但是所有建议的修复都不起作用。这是代码;

FutureBuilder(
      future: jwtOrEmpty,
      builder: (context, snapshot) {
        if(!snapshot.hasData) return CircularProgressIndicator();
        if(snapshot.data != "") {
          var str = snapshot.data;
          var jwt = str.split(".");

          if(jwt.length !=3) {
            return LoginPage();
          } else {
            var payload = json.decode(ascii.decode(base64.decode(base64.normalize(jwt[1]))));
            if(DateTime.fromMillisecondsSinceEpoch(payload["exp"]*1000).isAfter(DateTime.now())) {
              return HomePage(str, payload);
            } else {
              return LoginPage();
            }
          }
        } else {
          return LoginPage();
        }
      }
  ),

我猜是因为返回的 snapshot.data 不能为 null。但我不确定我能做些什么。我尝试添加“!”和 ”?” snapshot.datastrjwtsplit 但没有任何效果。

2 个答案:

答案 0 :(得分:0)

它想说的是您的 str 可能为 null,因为 snapshot.data 可能为 null。

所以使用它的一种方法是,

var jwt = str!.split('.'); // This means we are saying that str will never be null.

但显然,如果 str 在运行时实际上是 null,这会崩溃。

更好的方法,

var str = snapshot.data;
var jwt = [];

if (str != null)
  jwt = str.split(".");

假设您的 snapshot.data 是一个字符串,这将永远不会崩溃,因为我们进行了空检查。

答案 1 :(得分:0)

尽管 Android Studio 另有说法,但看起来问题不在于 Null 安全,而是因为“str”并不是真正的字符串。所以我这样做了;

var str = snapshot.data;
var jwt = str.toString().split("."); 

此外,我不得不将 // @dart=2.9 添加到文件顶部,因为 Flutter 存储依赖项不支持 NULL SAFETY。