【问题标题】:Error: 'split' can't be unconditionally invoked because the receiver can be 'null'错误:不能无条件调用“split”,因为接收者可以为“null”
【发布时间】:2021-08-18 00:26:40
【问题描述】:

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

【问题讨论】:

  • str?.split(".")str?.split?.call(".") 应该可以工作,或者 str!.split(".") 如果你确定它不为空

标签: flutter dart dart-null-safety


【解决方案1】:

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

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

另外,我必须将// @dart=2.9 添加到文件顶部,因为颤振存储依赖项不支持 NULL SAFETY。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 不幸的是,两者都不起作用。 “split”仍然显示为红色。
    • @Meggy 你能详细说明它仍然是showing red 是什么意思吗?是否显示警告?
    • 红色下划线的是“jwt = str.split”的“split”部分。尽管 Android Studio 声称这是一个空安全错误,但实际上这是因为“str”实际上不是字符串而是对象。这样做解决了问题 - str.toString()
    • 哦,好吧。那么你的问题现在解决了吗?
    • 是的。我发布了答案。谢谢!
    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 2021-09-05
    • 2023-03-05
    • 1970-01-01
    • 2022-08-24
    • 2021-10-05
    相关资源
    最近更新 更多