準備
パッケージの追加
dependencies: country_picker: ^2.0.23
インポート文
import 'package:country_picker/country_picker.dart';
showCountryPicker
- ドキュメント:showCountryPicker function - country_picker library - Dart API
- 国の選択を行える関数です。
パラメータ
- 設定できる代表的な引数は以下の通りです(必須のものは赤文字)。
- 詳しい説明などを見たい方は公式ドキュメントを見てください⇒showCountryPicker function - country_picker library - Dart API
context | |
---|---|
onSelect |
|
onClosed | 何も選択せずに閉じたときに呼び出される。 |
showPhoneCode | 電話番号における国コード(日本だと81)を表示するか(デフォルトは非表示) |
showSearch | 検索ボックスを表示するか(デフォルトは非表示) |
countryFilter | 選択できる国名をList |
サンプルコードと解説
サンプルコード
showCountryPicker( context: context, showPhoneCode: true, //国コードの表示(デフォルトでfalse) showSearch: true, //検索ボックスの表示(デフォルトでtrueなので設定しなくても可) countryFilter: <String>['JP', 'US'], //表示する国 onSelect: (Country country) {}, //選択したときの処理 onClosed: () {}, //選択せず閉じたときの処理 );
表示例と解説
日本語表示
flutter_localizationsの導入
- flutter_localizationsパッケージを使えば国名を日本語で表示できます(ver2.0.21あたりからの機能らしいです)。
- こちらのサイトを参考にpubspec.yamlを編集します(その他のファイルは編集せず大丈夫でした)。
MaterialAppの編集
- こちらも先ほどのサイトを参考に「supportedLocales」と「localizationsDelegates」を編集して、先ほどのサンプルコードを走らせると以下のように日本語で表示されるようになります。
Country型変数
- ドキュメント:Country class - country_picker library - Dart API
- onSelectの引数にもなっている国についてのデータを所持しているクラスです。
- 保持しているパラメータを以下に示します。
PhoneCode | 国ごとの電話コード(日本なら81) |
---|---|
countryCode | 国コード(日本ならJP) |
name | 英名 |
nameLocalized | flutter_localizationsで設定した地域に合わせた名称 |
flagEmoji | 国旗の絵文字 |
デモアプリ
- 日本、アメリカ、カナダ、オーストラリア、ドイツの5か国を選択できるようにしています。
- 選択した国は変数として保存し、名称や国旗を表示します。
サンプルコード
# 一部のみ dependencies: flutter: sdk: flutter flutter_localizations: sdk: flutter cupertino_icons: ^1.0.2 country_picker: ^2.0.21 country_list_pick: ^1.0.1+6
import 'package:flutter/material.dart'; import 'package:country_picker/country_picker.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; void main() { final app = MaterialApp( theme: ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), useMaterial3: true, ), home: const MyHomePage(), // ここを追加する。 supportedLocales: [ const Locale('en'), const Locale('ja'), ], localizationsDelegates: [ CountryLocalizations.delegate, GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], ); runApp(app); } class MyHomePage extends StatefulWidget { const MyHomePage({super.key}); @override State<MyHomePage> createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { Country? selectedCountry; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Theme.of(context).colorScheme.inversePrimary, title: const Text('country picker'), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ // 余白 ElevatedButton( onPressed: (){ showCountryPicker( context: context, countryFilter: <String>['JP', 'US', 'CA', 'AU', 'DE'], onSelect: (Country country) { setState(() { selectedCountry = country; }); }, onClosed: () { // 何もせずに閉じた場合は選択を解除 setState(() { selectedCountry = null; }); }, ); }, child: const Text('showCountryPicker'), ), // 国が選択されていた場合 if(selectedCountry!=null)...{ Text('---selectedCountry---'), Text('phoneCode = ${selectedCountry!.phoneCode}'), Text('countryCode = ${selectedCountry!.countryCode}'), Text('name = ${selectedCountry!.name}'), Text('nameLocalized = ${selectedCountry!.nameLocalized}'), Text('flag = ${selectedCountry!.flagEmoji}'), } ], ), ), ); } }
実行結果
(1) 国選択
(2) 選択後の表示