如何按ISO8601格式的favoriteDateTime对Movies对象列表排序?
问题分析与解决方案
现有代码的问题
你当前的代码是对每个series下的收藏电影单独排序后再合并到总列表,最终总列表只是各series内部的电影按favoriteDateTime降序排列,但整个总列表并非全局统一排序——如果不同series的电影收藏时间有交叉,最终结果的顺序会不符合预期。
推荐的排序方式
正确的做法是:先一次性收集所有符合条件的收藏电影,再对整个列表进行一次全局排序。这样能保证最终列表里的所有电影都严格按照favoriteDateTime统一排序。
优化后的代码实现
List<Movies> get movies { // 先收集所有符合条件的收藏电影 final favMoviesList = <Movies>[]; for (final category in _appData.categories) { for (final series in category.series ?? []) { // 用?? []避免空指针异常 final favMovies = series.movie?.where((movie) { // 空安全的条件判断,确保必要字段非空 return movie.stats != null && movie.stats!.isFavourite == true && movie.stats!.favoriteDateTime != null; }).toList() ?? []; favMoviesList.addAll(favMovies); } } // 对整个列表全局排序,按favoriteDateTime降序(最新收藏的电影排在前面) favMoviesList.sort((a, b) { return b.stats!.favoriteDateTime!.compareTo(a.stats!.favoriteDateTime!); }); return favMoviesList; }
额外说明
- 如果需要升序排列(最早收藏的电影在前),只需把排序逻辑改为
a.stats!.favoriteDateTime!.compareTo(b.stats!.favoriteDateTime!)即可。 - 代码中优化了空安全处理,用
?? []替代强制解包!,避免因series或movie为空导致崩溃;同时在过滤条件中确保favoriteDateTime非空,让排序操作更安全。
内容的提问来源于stack exchange,提问作者Digamber negi
相关产品推荐
相关产品推荐

