Error: 'split' can't be unconditionally invoked because the receiver can be 'null'

Error: 'split' can't be unconditionally invoked because the receiver can be 'null'

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 

但是 none 的建议修复有效。这是代码;

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 不能为空。但我不确定我能做些什么。我尝试添加“!”和 ”?”到 snapshot.datastrjwtsplit,但没有任何效果。

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

所以一种使用方法是,

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 是一个字符串,这将永远不会崩溃,因为我们正在进行空检查。

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

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

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