- ホーム
- ブログ
- 【Flutter】カウンターアプリから初めての自作アプリ
- 【Flutter】MapをListに変換して、ListViewで表示する
今回のコードはカウンターアプリをもとに新しいアプリを作る、続きと関連しているので、よかったらそちらも参考にしてみてください。 初心者のうちは、Mapとは,Listとは何か、から始まって、Listから必要な要素を取り出す、Mapから必要なkeyやvalueを取り出す、MapをListに変換する、変換したものをListViewで表示する、等々なかなかスムーズにできないものです。 今回もカウンターアプリのコードを基本にMapデータをlistデータに変換してListViewウイジットで表示するという簡単なアプリを作ってみたので紹介します。
まずはコード全文です
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
State<StatefulWidget> createState() {
return ListState();
}
}
class ListState extends State<MyHomePage> {
Map<String, String> _japaneseMlbPlayers = {
'Shohei Ohtani': 'Los Angeles Angels',
'Yu Darvish': 'San Diego Padres',
'Kenta Maeda': 'Minnesota Twins',
'Shogo Akiyama': 'Cincinnati Reds',
'Yoshi Tsutsugo': 'Pittsburgh Pirates',
'test1': 'test1',
'test2': 'test2',
};
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter = (_counter + 1) % _japaneseMlbPlayers.length;
print(_counter);
});
}
Widget build(BuildContext context) {
final listJmp = _japaneseMlbPlayers.entries
.map((e) => JapaneseMlbPlayer(e.key, e.value))
.toList();
for (int i = 0; i < listJmp.length; i++) {
print(listJmp[i].name);
print(listJmp[i].team);
}
return Scaffold(
appBar: AppBar(
title: Text("Japanese MLB Player"),
),
body: ListView.builder(
itemBuilder: (BuildContext context, int index) {
return Container(
child: ListTile(
title: _textWidget(listJmp, index, _counter, 'name'),
subtitle: _textWidget(listJmp, index, _counter, 'team'),
),
);
},
itemCount: _japaneseMlbPlayers.length,
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
class JapaneseMlbPlayer {
String name;
String team;
JapaneseMlbPlayer(this.name, this.team);
}
Widget _textWidget(List list, int index, int counter, String key) {
if (key == 'name') {
return Text(
list[index].name,
style:
index == counter ? TextStyle(color: Colors.blue, fontSize: 28) : null,
);
}
if (key == 'team') {
return Text(
list[index].team,
style:
index == counter ? TextStyle(color: Colors.red, fontSize: 28) : null,
);
} else {
return Text('nothing');
}
}
Listを入れるModelクラスとして、JapaneseMlbPlayer
を用意します。
<Map型>.entries.map((e) => <Modelクラス>(e.key, e.value)).toList();
で、Map からListに変換することができます。
// リストを入れるModelクラス
class JapaneseMlbPlayer {
String name;
String team;
JapaneseMlbPlayer(this.name, this.team);
}
// Map => List
final listJmp = _japaneseMlbPlayers.entries
.map((e) => JapaneseMlbPlayer(e.key, e.value))
.toList();
// Listから要素を取り出す
for (int i = 0; i < listJmp.length; i++) {
print(listJmp[i].name);
print(listJmp[i].team);
}
ListTile表示用
に_textWidget
を作るkey
にname
が指定されたとき、team
が指定されたときで分岐させ、index
の値とcounter
の値が同じときは、Text
の色とサイズが変更される_textWidget
を作成。
Widget _textWidget(List list, int index, int counter, String key) {
if (key == 'name') {
return Text(
list[index].name,
style:
index == counter ? TextStyle(color: Colors.blue, fontSize: 28) : null,
);
}
if (key == 'team') {
return Text(
list[index].team,
style:
index == counter ? TextStyle(color: Colors.red, fontSize: 28) : null,
);
} else {
return Text('nothing');
}
}
ListTile
に,name
とteam
を表示する_textWidget
を使って、ListTile
のtitle:
、subtitle:
にname
とteam
を表示する。
child: ListTile(
title: _textWidget(listJmp, index, _counter, 'name'),
subtitle: _textWidget(listJmp, index, _counter, 'team'),
),
floatingActionButton
を押すと、Text
の色とフォントサイズが順番に変化する_incrementCounter()
を定義し、floatingActionButton
が押されるごとに呼び出される。
// Listの要素数に応じてカウントする関数
void _incrementCounter() {
setState(() {
_counter = (_counter + 1) % _japaneseMlbPlayers.length;
print(_counter);
});
}
// ボタンを押すたびに_incrementCounterが呼出されるようにする。
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
以上簡単ですが、MapからListへ変換して表示するアプリでした。
可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。
Read More可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。
Read More