🛺

DartのWhereを使う

2023/10/30に公開

Overview

https://api.flutter.dev/flutter/dart-core/Iterable/where.html

述語テストを満たすすべての要素を含む新しい遅延 Iterable を作成します。

一致する要素は、返されたイテラブル内でイテレータ内の順序と同じ順序になります。

このメソッドは、マップされた要素のビューを返します。 返された Iterable が反復されない限り、提供された関数 test は呼び出されません。 反復処理では結果がキャッシュされないため、返された Iterable を複数回反復処理すると、同じ要素に対して指定された関数テストが複数回呼び出される可能性があります。

summary

whereの役割は、Listから条件に一致する値だけを抽出するものです。今回はダミーのデータを作成して、条件に一致するデータを抽出してみましょう!

🧊Freezedでモデルクラスを作る

人間というクラスを作ってこの中に、ダミーの値を入れる。

import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter/foundation.dart';

part 'person.freezed.dart';
part 'person.g.dart';

// flutter pub run build_runner watch --delete-conflicting-outputs


class Person with _$Person {
  const factory Person({
    required String name,
    required int age,
  }) = _Person;

  factory Person.fromJson(Map<String, dynamic> json) =>
      _$PersonFromJson(json);
}

🔍whereで条件にある値だけを抽出する

import 'package:dart_three_example/example/where/modle/person.dart';
import 'package:flutter/material.dart';

class PersonList extends StatelessWidget {
  const PersonList({Key? key}) : super(key: key);

  
  Widget build(BuildContext context) {
    // ダミーの値を入れた変数を作成
    final persons = person();
    return Scaffold(
      appBar: AppBar(
        title: const Text('Person List'),
      ),
      body: Center(
        child: Column(
          // whereを使って、年齢が18以下の人だけを抽出して、リストにする。Taroは20なので除外される。
          children: persons.where((person) => person.age <= 18).map((person) {
            return Text('${person.name} ${person.age}');
          }).toList(),
        ),
      ),
    );
  }
  // ダミーの値を入れListの関数を作る。
  List<Person> person() {
    return const [
      Person(name: 'Taro', age: 20),
      Person(name: 'Hanako', age: 18),
      Person(name: 'Jiro', age: 15),
      Person(name: 'mimi', age: 12),
      Person(name: 'Jon', age: 8),
    ];
  }
}

importしてビルドしてみる。

import 'package:dart_three_example/example/where/person.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

void main() {
  runApp(const ProviderScope(child: MyApp()));
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const PersonList(),
    );
  }
}

実行結果

18歳以下の年齢のデータのみ抽出に成功しました。

thoughts

なぜ今回のような記事を書いたのかというと、仕事でwhere文を使ったり、Listのデータ型にFreezedを使用して、作成したモデルクラスをデータ型に使って作ったListをUIに表示することが多かったので、やってみました。
最近は、Dartのロジックを使って、独特なWidgetを作成することが多いので、色々実験してキャッチアップをしております。

Discussion