Flutter: Filter list as per some condition
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"
),
),
);
}
}
Solution 1:
toList()
is missing to materializer the result
_AnimatedMovies = AllMovies.where((i) => i.isAnimated).toList();
Solution 2:
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');
}
- You can also Use
takeWhile
The methods takeWhile()
can also help you filter elements from an Iterable.
_AnimatedMovies = AllMovies.takeWhile((i) => i.isAnimated).toList();
Solution 3:
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;
}