Skip to content

Instantly share code, notes, and snippets.

@utisam
Created September 26, 2023 02:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save utisam/f003c98852f0ec9d3c1b356dca4c4d17 to your computer and use it in GitHub Desktop.
Save utisam/f003c98852f0ec9d3c1b356dca4c4d17 to your computer and use it in GitHub Desktop.
フィルタ付き選択ダイアログ
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
void main() => runApp(MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text("フィルタ付き選択ダイアログ"),
),
body: ListView(
children: const [SelectTile()],
),
),
));
typedef Prefecture = (String, {String hiragana, String roman});
class SelectTile extends HookWidget {
const SelectTile();
@override
Widget build(BuildContext context) {
final pref = useState<Prefecture?>(null);
return ListTile(
title: const Text("県"),
subtitle: Text(pref.value?.$1 ?? "選択されていません"),
onTap: () async {
final selected = await PrefSelectDialog.show(context);
if (selected != null) pref.value = selected;
}
);
}
}
class PrefSelectDialog extends StatelessWidget {
static Future<Prefecture?> show(BuildContext context) =>
showDialog(context: context, builder: (_) => const PrefSelectDialog());
const PrefSelectDialog();
@override
Widget build(BuildContext context) {
return AlertDialog(
title: const Text("県を選択"),
content: PrefectureList(
onTap: (pref) => Navigator.pop(context, pref),
),
actions: <Widget>[
TextButton(
onPressed: () => Navigator.pop(context),
child: const Text("キャンセル"),
),
],
);
}
}
class PrefectureList extends HookWidget {
final void Function(Prefecture) onTap;
const PrefectureList({required this.onTap});
@override
Widget build(BuildContext context) {
final controller = useTextEditingController();
useListenable(controller);
return SizedBox(
width: 420,
height: 480,
child: Column(
children: [
TextField(
controller: controller,
decoration: InputDecoration(
prefixIcon: const Padding(
padding: EdgeInsets.symmetric(horizontal: 16.0),
child: Icon(Icons.search),
),
contentPadding: const EdgeInsets.all(16),
border:
OutlineInputBorder(borderRadius: BorderRadius.circular(24)),
),
),
const SizedBox(height: 16),
Expanded(
child: ListView(
scrollDirection: Axis.vertical,
shrinkWrap: true,
children: prefectures
.where((pref) {
final (name, hiragana: hiragana, roman: roman) = pref;
final text = controller.text.toLowerCase();
return name.contains(text) || hiragana.contains(text) || roman.contains(text);
})
.map((pref) => ListTile(
title: Text(pref.$1),
onTap: () => onTap(pref),
))
.toList()
),
),
],
),
);
}
}
const prefectures = <Prefecture>[
("北海道", hiragana: "ほっかいどう", roman: "hokkaido"),
("青森県", hiragana: "あおもり", roman: "aomori"),
("岩手県", hiragana: "いわて", roman: "iwate"),
("宮城県", hiragana: "みやぎ", roman: "miyagi"),
("秋田県", hiragana: "あきた", roman: "akita"),
("山形県", hiragana: "やまがた", roman: "yamagata"),
("福島県", hiragana: "ふくしま", roman: "fukushima"),
("茨城県", hiragana: "いばらき", roman: "ibaraki"),
("栃木県", hiragana: "とちぎ", roman: "tochigi"),
("群馬県", hiragana: "ぐんま", roman: "gunma"),
("埼玉県", hiragana: "さいたま", roman: "saitama"),
("千葉県", hiragana: "ちば", roman: "chiba"),
("東京都", hiragana: "とうきょう", roman: "tokyo"),
("神奈川県", hiragana: "かながわ", roman: "kanagawa"),
("新潟県", hiragana: "にいがた", roman: "niigata"),
("富山県", hiragana: "とやま", roman: "toyama"),
("石川県", hiragana: "いしかわ", roman: "ishikawa"),
("福井県", hiragana: "ふくい", roman: "fukui"),
("山梨県", hiragana: "やまなし", roman: "yamanashi"),
("長野県", hiragana: "ながの", roman: "nagano"),
("岐阜県", hiragana: "ぎふ", roman: "gifu"),
("静岡県", hiragana: "しずおか", roman: "shizuoka"),
("愛知県", hiragana: "あいち", roman: "aichi"),
("三重県", hiragana: "みえ", roman: "mie"),
("滋賀県", hiragana: "しが", roman: "shiga"),
("京都府", hiragana: "きょうと", roman: "kyoto"),
("大阪府", hiragana: "おおさか", roman: "osaka"),
("兵庫県", hiragana: "ひょうご", roman: "hyogo"),
("奈良県", hiragana: "なら", roman: "nara"),
("和歌山県", hiragana: "わかやま", roman: "wakayama"),
("鳥取県", hiragana: "とっとり", roman: "tottori"),
("島根県", hiragana: "しまね", roman: "shimane"),
("岡山県", hiragana: "おかやま", roman: "okayama"),
("広島県", hiragana: "ひろしま", roman: "hiroshima"),
("山口県", hiragana: "やまぐち", roman: "yamaguchi"),
("徳島県", hiragana: "とくしま", roman: "tokushima"),
("香川県", hiragana: "かがわ", roman: "kagawa"),
("愛媛県", hiragana: "えひめ", roman: "ehime"),
("高知県", hiragana: "こうち", roman: "kochi"),
("福岡県", hiragana: "ふくおか", roman: "fukuoka"),
("佐賀県", hiragana: "さが", roman: "saga"),
("長崎県", hiragana: "ながさき", roman: "nagasaki"),
("熊本県", hiragana: "くまもと", roman: "kumamoto"),
("大分県", hiragana: "おおいた", roman: "oita"),
("宮崎県", hiragana: "みやざき", roman: "miyazaki"),
("鹿児島県", hiragana: "かごしま", roman: "kagoshima"),
("沖縄県", hiragana: "おきなわ", roman: "okinawa"),
];
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment