Flutter: Filter list as per some condition

FlutterDartFilter

Flutter Problem Overview


I'm having a list of Movies. That contains all Animated & non Animated Movies. To identify whether it's Animated or not there is one flag called isAnimated.

I want to show only Animated movies. I have written code to filter out only Animated movies but getting some error.

import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      theme: new ThemeData(

        primarySwatch: Colors.blue,
      ),
      home: new HomePage(),
    );
  }
}

class Movie {
  Movie({this.movieName, this.isAnimated, this.rating});
  final String movieName;
  final bool isAnimated;
  final double rating;
}

List<Movie> AllMovies = [
  new Movie(movieName: "Toy Story",isAnimated: true,rating: 4.0),
  new Movie(movieName: "How to Train Your Dragon",isAnimated: true,rating: 4.0),
  new Movie(movieName: "Hate Story",isAnimated: false,rating: 1.0),
  new Movie(movieName: "Minions",isAnimated: true,rating: 4.0),
];



class HomePage extends StatefulWidget{
  @override
  _homePageState createState() => new _homePageState();
}


class _homePageState extends State<HomePage> {

  List<Movie> _AnimatedMovies = null;

  @override
  void initState() {
    super.initState();
    _AnimatedMovies = AllMovies.where((i) => i.isAnimated);
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new Container(
        child: new Text(
            "All Animated Movies here"
        ),
      ),
    );
  }
}

WhereIterable<Object> is not subtype of type List<Object>

Flutter Solutions


Solution 1 - Flutter

toList() is missing to materializer the result

_AnimatedMovies = AllMovies.where((i) => i.isAnimated).toList();

Solution 2 - Flutter

The Solution is here

> Just try with this Function getCategoryList(),
> Here the condition will be catogory_id == '1' from the list

List<dynamic> getCategoryList(List<dynamic> inputlist) {
    List outputList = inputlist.where((o) => o['category_id'] == '1').toList();
    return outputList;
  }

Solution 3 - Flutter

You can use toList() method to get your desire output like following

toList() Collects all elements of this stream in a List.

To fix the above issue:

Add a toList() (This code creates a List<dynamic>)

_AnimatedMovies = AllMovies.where((i) => i.isAnimated).toList();

instead of

_AnimatedMovies = AllMovies.where((i) => i.isAnimated);

The output of where() is another Iterable, and you can use it as such to iterate over it or apply other Iterable methods. In the next example, the output of where() is used directly inside the for-in loop.

var evenNumbers = AllMovies.where((i) => i.isAnimated).toList();
for (var i in evenNumbers) {
  print('$i');
}

2. You can also Use takeWhile

The methods takeWhile() can also help you filter elements from an Iterable.

 _AnimatedMovies = AllMovies.takeWhile((i) => i.isAnimated).toList();

enter image description here

Solution 4 - Flutter

You can use this for specific condition

List<String> strings = ['one', 'two', 'three', 'four', 'five'];
List<String> filteredStrings  = strings.where((item) {
   return item.length == 3;
});

Solution 5 - Flutter

where function on a List returns Iterable. You have to convert it to List using the function List.from(Iterable).

So in the above scenario you should use the following code snippet.

Iterable _AnimatedMoviesIterable = AllMovies.where((i) => i.isAnimated);

_AnimatedMovies = List.from(_AnimatedMoviesIterable);

Solution 6 - Flutter

Here courses is a list. The element which are note starred setting to the courses list. starred is a bool type variable.

courses = courses.where((element) => !element.starred).toList();

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTushar PolView Question on Stackoverflow
Solution 1 - FlutterGünter ZöchbauerView Answer on Stackoverflow
Solution 2 - FlutterRahul RajView Answer on Stackoverflow
Solution 3 - FlutterParesh MangukiyaView Answer on Stackoverflow
Solution 4 - FlutterParitosh AgrawalView Answer on Stackoverflow
Solution 5 - FlutterGavara.SuneelView Answer on Stackoverflow
Solution 6 - FlutterImran SefatView Answer on Stackoverflow