158 votes

Flutter : Filtrer la liste en fonction de certaines conditions

J'ai une liste de films. Elle contient tous les films animés et non animés. Pour identifier s'il s'agit d'un film animé ou non, il existe un indicateur appelé isAnimated .

Je veux afficher uniquement les films d'animation. J'ai écrit un code pour filtrer uniquement les films d'animation, mais je reçois une erreur.

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 is not subtype of type List

333voto

Günter Zöchbauer Points 21340

toList() est manquant pour matérialiser le résultat

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

2 votes

Cela ne fonctionne pas ici :( . Le type 'Where Iterable<>' n'est pas un sous-type du type 'List'.

4 votes

Si vous avez besoin d'un List ajouter .toList()

0 votes

Cela a fonctionné comme un charme en fait, j'ai créé une application dans laquelle j'ai des données statiques (liste d'un modèle) et quand je navigue vers une page de vue unique, j'envoie l'id du modèle et je trouve le modèle par id et montre ses données dans la page de vue unique. Je fais comme ceci CompanyModel company = companies.where((c) => c.id == companyId).toList().first;

19voto

Rahul Raj Points 15

La solution est ici

Essayez simplement avec cette fonction catogoryList(),
Ici la condition sera catogory_id == '1' de la liste.

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

8voto

Paresh Mangukiya Points 13942

Vous pouvez utiliser toList() pour obtenir le résultat souhaité comme suit

toList() Collecte tous les éléments de ce flux dans un List .

Pour résoudre le problème ci-dessus :

Ajouter un toList() (Ce code crée un List<dynamic> )

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

au lieu de

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

La sortie de where() est un autre Iterable, et vous pouvez l'utiliser comme tel pour l'itérer ou appliquer d'autres méthodes Iterable. Dans l'exemple suivant, la sortie de where() est utilisé directement à l'intérieur de l'élément for-in boucle.

var evenNumbers = AllMovies.where((i) => i.isAnimated).toList();
for (var i in evenNumbers) {
  print('$i');
}
  1. Vous pouvez également utiliser takeWhile

Les méthodes takeWhile() peut également vous aider à filtrer les éléments d'un Iterable.

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

enter image description here

6voto

Vous pouvez l'utiliser pour une condition spécifique

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

0voto

Gavara.Suneel Points 21

Où la fonction sur une liste retourne un Iterable. Vous devez le convertir en liste en utilisant la fonction List.from(Iterable).

Dans le scénario ci-dessus, vous devez donc utiliser le code suivant.

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

_AnimatedMovies = List.from(_AnimatedMoviesIterable) ;

2 votes

Les itérables ont un toList() qui est beaucoup plus facile à lire, selon moi.

0 votes

D'accord @GünterZöchbauer. Nous pouvons utiliser AllMovies.where((i) => i.isAnimated).toList() ; comme vous l'avez mentionné.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X