【问题标题】:Why does the ".where" method not filter through my List object?为什么“.where”方法不能过滤我的 List 对象?
【发布时间】:2020-08-25 15:43:40
【问题描述】:

我为我正在开发的电影评论应用程序编写了以下代码。 Movie 类具有一些布尔属性,用于确认电影是否属于特定类型,例如 isRomantic。

但是,例如,以下代码无法仅显示浪漫电影,而是仅显示所有电影名称。

我有两个问题:

  1. 我做错了什么?

  2. 假设下面的代码和上面提到的预期功能是我想要应用程序做的所有事情,你会说我下面的代码有多高效/优化?我是 Dart 新手,希望得到一些反馈。

谢谢。

class MyApp extends StatelessWidget {
  List<Movie> movieList = listOfMovieObjects().where((isRomantic) => true);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Container(
          child: ListView(
            children: createListOfMovieItems(),
          ),
        ),
      ),
    );
  }

  List<Widget> createListOfMovieItems() {
    List<Widget> myList = [];
    for (var i = 0; i < movieList.length; i++) {
      myList.add(buildMovieItem(movieList[i], i));
    }
    return myList;
  }
}

class Movie {
  String movieName;
  bool isRomantic;
  bool isComedy;
  bool isAction;

  Movie({this.movieName, this.isRomantic, this.isComedy, this.isAction});
}

List<Movie> listOfMovieObjects() {
  return <Movie>[
    Movie(movieName: '1', isRomantic: true, isComedy: true, isAction: false),
    Movie(movieName: '2', isRomantic: false, isComedy: false, isAction: true),
    Movie(movieName: '3', isRomantic: false, isComedy: true, isAction: true),
    Movie(movieName: '4', isRomantic: true, isComedy: true, isAction: true),
  ];
}

Widget buildMovieItem(Movie movie) {
  return Center(
    child: Container(
      child: Text(
        movie.movieName,
        style: TextStyle(fontWeight: FontWeight.w800, fontSize: 80.0),
      ),
      height: 100.0,
      width: double.infinity,
    ),
  );
}

【问题讨论】:

    标签: flutter listview dart where-clause


    【解决方案1】:

    问题是在您的代码where((isRomantic) =&gt; true)“isRomantic”上是您分配给当前元素的名称,而不是 bool 属性,并且该函数始终返回 true,这就是您获取所有电影的原因。

    同样 .where 返回一个惰性迭代,你应该使用 .toList() 方法来获取过滤后的列表。

    试试这个:

    List<Movie> movieList = listOfMovieObjects().where((m) => m.isRomantic).toList();
    

    【讨论】:

    • 谢谢你,完美!当你说.where((m) =&gt; m.isRomantic) 时,你是在定义一个名为 m 的新参数,对吧?
    • 没错!当您迭代集合时,m 是可迭代对象上的当前元素(电影),因此该函数根据 isRomantic 属性测试每个元素
    【解决方案2】:

    试试这个:

    List<Movie> movieList = listOfMovieObjects().where((movie) => movie.isRomantic).toList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-28
      • 1970-01-01
      • 2021-09-01
      • 2010-10-06
      • 1970-01-01
      相关资源
      最近更新 更多