Flutter 错误:';拆分';can';不能无条件地调用,因为接收方可以是';空';

Flutter 错误:';拆分';can';不能无条件地调用,因为接收方可以是';空';,flutter,dart,dart-null-safety,Flutter,Dart,Dart Null Safety,Android Studio在颤振中的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 但建议的修复方案都

Android Studio在颤振中的
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
不能为空。但我不确定我能做些什么。我尝试将“!”和“?”添加到
snapshot.data
str
jwt
split
中,但没有任何效果。

它试图说的是,您的
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(".");

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

尽管Android Studio没有这样说,但问题似乎不是空安全性,而是因为“str”不是真正的字符串。所以我就这样做了,

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

此外,我还必须将
/@dart=2.9
添加到文件顶部,因为flatter存储依赖项不支持空安全性。

str?.split(“.”)或
str?.split?.call(“.”
应该可以工作或
str!。split(“.”
如果您确定它不是空的,那么很遗憾,这两种方法都不起作用。“split”仍然显示为红色。@Meggy您能详细说明一下它仍然显示为红色是什么意思吗?它是否显示警告?是“jwt=str.split”的“split”部分带红色下划线。虽然Android Studio声称这是一个空安全错误,但事实上这是因为“str”实际上不是字符串而是对象。这样做解决了问题-str.toString()哦,好的。你的问题现在解决了吗?是的。我张贴了答案。谢谢