Dart使用List.sort按价格排序列表报int返回值非空错误修复
报错原因
List.sort() 方法要求传入的比较函数必须返回一个非空int类型值,用来判定两个元素的排序优先级:
- 返回值 < 0:a排在b前面
- 返回值 = 0:a和b位置相等
- 返回值 > 0:b排在a前面
你的代码里比较函数用大括号包裹了逻辑块,但调用a.price.compareTo(b.price)时没有加return关键字,这个函数不会把compareTo的结果返回给sort方法,默认返回null,和要求的非空int返回值规则冲突,因此抛出该错误。另外你写的print((books))多套了一层括号,虽然不影响运行,但属于冗余写法。
修复方案
二选一即可:
方案1:箭头函数简写(单逻辑行推荐)
如果比较逻辑只有一行,直接用箭头函数语法,会自动隐式返回执行结果,代码更简洁:
sortAll(List<BookModel> books) { // 升序排序,要降序就改成 b.price.compareTo(a.price) books.sort((a, b) => a.price.compareTo(b.price)); print(books); }
方案2:保留代码块写法,显式加return
如果后续要在比较逻辑里加其他判断,需要保留大括号代码块的话,必须显式return比较结果:
sortAll(List<BookModel> books) { books.sort((a, b) { // 这里可以加其他自定义判断逻辑 return a.price.compareTo(b.price); }); print(books); }
注意事项
- 上述默认写法是按价格从小到大升序排列,需要从大到小降序的话,只需要把compareTo的调用双方调换位置即可
- 要保证
BookModel里的price字段是int/double/num这类实现了Comparable接口的类型,否则compareTo方法本身会调用失败
内容的提问来源于stack exchange,提问作者dsfsfsdf rwrrwr
相关产品推荐
相关产品推荐

