首页 > 解决方案 > 我们可以在具有 null 安全功能的情况下执行“Not null or return”吗?

问题描述

我正在尝试将 null 安全功能迁移到我的 Flutter 项目中,因为这对我的项目未来有好处。因为我已经有通过 Kotlin 开发 Android 应用程序的经验,所以我已经习惯了这个 null 安全特性。但似乎我无法执行可以在 Kotlin 中完成的一件事。

user?.name ?? "Unknown"

我注意到在 Dart 中,我可以使用此代码行设置默认值。现在我正在尝试执行此操作

fun performOrReturn(users: Map<String, User>, id: String) {
    val user = users[id] ?: return //This line

    println("User info gotten : ${user.name}")
}

在 Kotlin 中,我可以执行此操作。如果特定变量为空,我可以让方法自己返回,因此 Kotlin 可以灵活地处理空安全。

所以这就是我想要做的,我的代码中有表格。我想检查该字段的指定列和行中是否存在数据。

Map<int, List<MyData>> table = Map();

...

int _findDataExisting(int row, int col) {
    List<MyData> data = table[row]; //This is causing problem because table[row] can be null

    //Alternative solution is
    //List<MyData> data = table[row] ?? List.empty();
    //
    //if(data.isEmpty) {
    //    return -1;
    //}
    //

    for(int i = 0; i < data.length; i++) {
        if(data[i].column == col) {
            return i;
        }
    }

    return -1;
}

我想让它返回 -1 而不是初始化默认值,因为它不利于处理内存,并且代码效率低下。

List<MyData> data = map[row] ?? return -1;

我像 Kotlin 一样尝试了下面的行,但 Dart 似乎无法处理这个问题。

Dart 中是否有任何等价的东西?如果特定变量为空,则使其返回方法。

标签: flutterdart

解决方案


不要花哨。

int _findDataExisting(int row, int col) {
  if (table[row] != null) {
    List<MyData> data = table[row]!;
    for(int i = 0; i < data.length; i++) {
      if(data[i].column == col) {
        return i;
      }
    }
  }
  return -1;
}

推荐阅读