首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >颤栗-返回类型'Null‘不是'City',这是闭包上下文所要求的

颤栗-返回类型'Null‘不是'City',这是闭包上下文所要求的
EN

Stack Overflow用户
提问于 2022-09-16 05:59:55
回答 2查看 70关注 0票数 0

当我尝试使用List.firstWhere并将orElse设置为返回null时出错

错误显示:The return type 'Null' isn't a 'City', as required by the closure's context

下面的示例代码

代码语言:javascript
运行
复制
/// city.dart

class City {
  final int id;
  final String no;
  final String name;
  final String website;
  final bool status;

  City(this.id, this.no, this.name, this.website, this.status);

  City.fromJson(Map<String, dynamic> json)
      : id = json['id'],
        no = json['no'],
        name = json['name'],
        website = json['website'],
        status = json['status'];

  Map<String, dynamic> toJson() =>
      {'id': id, 'no': no, 'name': name, 'website': website, 'status': status};
}
代码语言:javascript
运行
复制
/// main.dart

/// declare a list variable
List<City> _cities = [];

...


_cities.firstWhere((element) => element.id == 1, orElse: () => null); // error here

虽然我可以在firstWhereOrNull中使用package:collection方法,并且不会出现任何错误,但我想知道如何正确地使用firstWhere。

谢谢你帮忙!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-16 06:16:06

它的抛出错误,因为您声明列表是non-null值。

如果我们研究这个函数,我们可以看到它们之间的不同。

  • firsWhereOrNull (包:集合)

就像你看到的,T?默认情况下为空。所以它将返回null。

代码语言:javascript
运行
复制
T? firstWhereOrNull(bool Function(T element) test) {
    for (var element in this) {
      if (test(element)) return element;
    }
    return null;
  }

  • firstWhere的非空值.基于声明的值,orElse的数据类型如下。由于您声明了List<City>,这是非空值,所以

然后,当您设置函数orElse: () => null时,它将throw IterableElementError.noElement();

代码语言:javascript
运行
复制
 E firstWhere(bool test(E element), {E orElse()?}) {
    for (E element in this) {
      if (test(element)) return element;
    }
    if (orElse != null) return orElse();
    throw IterableElementError.noElement();
  }

但是,如果您声明List<City?>,则firstWhere中的E现在是可空值。这样就不会有任何错误。

票数 1
EN

Stack Overflow用户

发布于 2022-09-16 06:16:23

您不能返回null,因为预计该方法将返回City类的实例,该实例不是nullable

你有两个解决方案:

  1. 您可以将_cities列表声明为List<City?> (可空城市列表)。然后,方法firstWhere可以返回null,但是您应该注意null safety,例如:调用element.

  1. 的另一种方法是创建empty City,因此在City类中创建静态字段:

代码语言:javascript
运行
复制
static const empty = City(
    id: 0,
    no: '',
    name: '',
    website: '',
    status: false,
  );

然后您可以返回这个empty City

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73740468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档