Flutter国家选择器插件country_pickers_v2的使用
Flutter国家选择器插件country_pickers_v2的使用
国家选择器
Countries, codes, flags 和几种选择它们的方式已经为你准备好了。只需要一个组件就可以搞定。
CountryPickerDropdown 示例
CountryPickerDropdown(
initialValue: 'AR',
itemBuilder: _buildDropdownItem,
itemFilter: ['AR', 'DE', 'GB', 'CN'].contains(c.isoCode),
priorityList:[
CountryPickerUtils.getCountryByIsoCode('GB'),
CountryPickerUtils.getCountryByIsoCode('CN'),
],
sortComparator: (Country a, Country b) => a.isoCode.compareTo(b.isoCode),
onValuePicked: (Country country) {
print("${country.name}");
},
)
Widget _buildDropdownItem(Country country) => Container(
child: Row(
children: <Widget>[
CountryPickerUtils.getDefaultFlagImage(country),
SizedBox(
width: 8.0,
),
Text("+${country.phoneCode}(${country.isoCode})"),
],
),
);
CountryPickerDialog 示例
void _openCountryPickerDialog() => showDialog(
context: context,
builder: (context) => Theme(
data: Theme.of(context).copyWith(primaryColor: Colors.pink),
child: CountryPickerDialog(
titlePadding: EdgeInsets.all(8.0),
searchCursorColor: Colors.pinkAccent,
searchInputDecoration: InputDecoration(hintText: 'Search...'),
isSearchable: true,
title: Text('Select your phone code'),
onValuePicked: (Country country) =>
setState(() => _selectedDialogCountry = country),
itemFilter: (c) => ['AR', 'DE', 'GB', 'CN'].contains(c.isoCode),
priorityList: [
CountryPickerUtils.getCountryByIsoCode('TR'),
CountryPickerUtils.getCountryByIsoCode('US'),
],
itemBuilder: _buildDialogItem,
),
),
);
CountryPickerCupertino 示例
void _openCupertinoCountryPicker() => showCupertinoModalPopup<void>(
context: context,
builder: (BuildContext context) {
return CountryPickerCupertino(
pickerSheetHeight: 300.0,
onValuePicked: (Country country) =>
setState(() => _selectedCupertinoCountry = country),
itemFilter: (c) => ['AR', 'DE', 'GB', 'CN'].contains(c.isoCode),
priorityList: [
CountryPickerUtils.getCountryByIsoCode('TR'),
CountryPickerUtils.getCountryByIsoCode('US'),
],
);
},
);
完整示例
import 'package:country_pickers_v2/country.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:country_pickers_v2/country_pickers.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: '国家选择器演示',
theme: ThemeData(
primarySwatch: Colors.blue,
),
routes: {
'/': (context) => DemoPage(),
},
);
}
}
class DemoPage extends StatefulWidget {
[@override](/user/override)
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<DemoPage> {
Country _selectedDialogCountry = CountryPickerUtils.getCountryByPhoneCode('90');
Country _selectedFilteredDialogCountry = CountryPickerUtils.getCountryByPhoneCode('90');
Country _selectedCupertinoCountry = CountryPickerUtils.getCountryByIsoCode('tr');
Country _selectedFilteredCupertinoCountry = CountryPickerUtils.getCountryByIsoCode('DE');
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('国家选择器演示'),
),
body: ListView(
padding: EdgeInsets.all(8.0),
children: <Widget>[
Card(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text('CountryPickerDropdown (SOLO)'),
_buildCountryPickerDropdownSoloExpanded(),
],
),
),
Card(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text('CountryPickerDropdown (selectedItemBuilder)'),
_buildCountryPickerDropdown(hasSelectedItemBuilder: true),
],
),
),
Card(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text('CountryPickerDropdown (filtered)'),
ListTile(title: _buildCountryPickerDropdown(filtered: true)),
],
),
),
Card(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text('CountryPickerDropdown (sorted by isoCode)'),
ListTile(
title: _buildCountryPickerDropdown(sortedByIsoCode: true)),
],
),
),
Card(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text("CountryPickerDropdown (has priorityList['GB,'CN'])"),
ListTile(
title: _buildCountryPickerDropdown(hasPriorityList: true)),
],
),
),
Card(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text("CountryPickerDialog (has priorityList['TR,'US'])"),
ListTile(
onTap: _openCountryPickerDialog,
title: _buildDialogItem(_selectedDialogCountry),
),
],
),
),
Card(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text('CountryPickerDialog (filtered)'),
ListTile(
onTap: _openFilteredCountryPickerDialog,
title: _buildDialogItem(_selectedFilteredDialogCountry),
),
],
),
),
Card(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text("CountryPickerCupertino (has priorityList['TR,'US'])"),
ListTile(
title: _buildCupertinoSelectedItem(_selectedCupertinoCountry),
onTap: _openCupertinoCountryPicker,
),
],
),
),
Card(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text('CountryPickerCupertino (filtered)'),
ListTile(
title: _buildCupertinoSelectedItem(_selectedFilteredCupertinoCountry),
onTap: _openFilteredCupertinoCountryPicker,
),
],
),
),
],
),
);
}
_buildCountryPickerDropdownSoloExpanded() {
return CountryPickerDropdown(
underline: Container(
height: 2,
color: Colors.red,
),
onTap: () => FocusScope.of(context).requestFocus(FocusNode()),
onValuePicked: (Country country) {
print("${country.name}");
},
itemBuilder: (Country country) {
return Row(
children: <Widget>[
SizedBox(width: 8.0),
CountryPickerUtils.getDefaultFlagImage(country),
SizedBox(width: 8.0),
Expanded(child: Text(country.name)),
],
);
},
itemHeight: null,
isExpanded: true,
icon: Icon(Icons.arrow_downward),
);
}
_buildCountryPickerDropdown({
bool filtered = false,
bool sortedByIsoCode = false,
bool hasPriorityList = false,
bool hasSelectedItemBuilder = false,
}) {
double dropdownButtonWidth = MediaQuery.of(context).size.width * 0.5;
double dropdownItemWidth = dropdownButtonWidth - 30;
double dropdownSelectedItemWidth = dropdownButtonWidth - 30;
return Row(
children: <Widget>[
SizedBox(
width: dropdownButtonWidth,
child: CountryPickerDropdown(
onTap: () => FocusScope.of(context).requestFocus(FocusNode()),
itemHeight: null,
isDense: false,
selectedItemBuilder: hasSelectedItemBuilder == true
? (Country country) => _buildDropdownSelectedItemBuilder(
country, dropdownSelectedItemWidth)
: null,
itemBuilder: (Country country) => hasSelectedItemBuilder == true
? _buildDropdownItemWithLongText(country, dropdownItemWidth)
: _buildDropdownItem(country, dropdownItemWidth),
initialValue: 'AR',
itemFilter: filtered
? (c) => ['AR', 'DE', 'GB', 'CN'].contains(c.isoCode)
: null,
priorityList: hasPriorityList
? [
CountryPickerUtils.getCountryByIsoCode('GB'),
CountryPickerUtils.getCountryByIsoCode('CN'),
]
: null,
sortComparator: sortedByIsoCode
? (Country a, Country b) => a.isoCode.compareTo(b.isoCode)
: null,
onValuePicked: (Country country) {
print("${country.name}");
},
),
),
SizedBox(
width: 8.0,
),
Expanded(
child: TextField(
decoration: InputDecoration(
labelText: "Phone",
isDense: true,
contentPadding: EdgeInsets.zero,
),
keyboardType: TextInputType.number,
),
)
],
);
}
Widget _buildDropdownItem(Country country, double dropdownItemWidth) =>
SizedBox(
width: dropdownItemWidth,
child: Row(
children: <Widget>[
CountryPickerUtils.getDefaultFlagImage(country),
SizedBox(
width: 8.0,
),
Expanded(child: Text("+${country.phoneCode}(${country.isoCode})")),
],
),
);
Widget _buildDropdownItemWithLongText(Country country, double dropdownItemWidth) =>
SizedBox(
width: dropdownItemWidth,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
children: <Widget>[
CountryPickerUtils.getDefaultFlagImage(country),
SizedBox(
width: 8.0,
),
Expanded(child: Text("${country.name}")),
],
),
),
);
Widget _buildDropdownSelectedItemBuilder(Country country, double dropdownItemWidth) =>
SizedBox(
width: dropdownItemWidth,
child: Padding(
padding: const EdgeInsets.all(8),
child: Row(
children: <Widget>[
CountryPickerUtils.getDefaultFlagImage(country),
SizedBox(
width: 8.0,
),
Expanded(
child: Text(
'${country.name}',
style: TextStyle(
color: Colors.red, fontWeight: FontWeight.bold),
)),
],
)));
Widget _buildDialogItem(Country country) => Row(
children: <Widget>[
CountryPickerUtils.getDefaultFlagImage(country),
SizedBox(width: 8.0),
Text("+${country.phoneCode}"),
SizedBox(width: 8.0),
Flexible(child: Text(country.name))
],
);
void _openCountryPickerDialog() => showDialog(
context: context,
builder: (context) => Theme(
data: Theme.of(context).copyWith(primaryColor: Colors.pink),
child: CountryPickerDialog(
titlePadding: EdgeInsets.all(8.0),
searchCursorColor: Colors.pinkAccent,
searchInputDecoration: InputDecoration(hintText: 'Search...'),
isSearchable: true,
title: Text('Select your phone code'),
onValuePicked: (Country country) =>
setState(() => _selectedDialogCountry = country),
itemBuilder: _buildDialogItem,
priorityList: [
CountryPickerUtils.getCountryByIsoCode('TR'),
CountryPickerUtils.getCountryByIsoCode('US'),
],
),
),
);
void _openFilteredCountryPickerDialog() => showDialog(
context: context,
builder: (context) => Theme(
data: Theme.of(context).copyWith(primaryColor: Colors.pink),
child: CountryPickerDialog(
titlePadding: EdgeInsets.all(8.0),
searchCursorColor: Colors.pinkAccent,
searchInputDecoration: InputDecoration(hintText: 'Search...'),
isSearchable: true,
title: Text('Select your phone code'),
onValuePicked: (Country country) =>
setState(() => _selectedFilteredDialogCountry = country),
itemFilter: (c) => ['AR', 'DE', 'GB', 'CN'].contains(c.isoCode),
itemBuilder: _buildDialogItem)),
);
void _openCupertinoCountryPicker() => showCupertinoModalPopup<void>(
context: context,
builder: (BuildContext context) {
return CountryPickerCupertino(
backgroundColor: Colors.black,
itemBuilder: _buildCupertinoItem,
pickerSheetHeight: 300.0,
pickerItemHeight: 75,
initialCountry: _selectedCupertinoCountry,
onValuePicked: (Country country) =>
setState(() => _selectedCupertinoCountry = country),
priorityList: [
CountryPickerUtils.getCountryByIsoCode('TR'),
CountryPickerUtils.getCountryByIsoCode('US'),
],
);
});
void _openFilteredCupertinoCountryPicker() => showCupertinoModalPopup<void>(
context: context,
builder: (BuildContext context) {
return CountryPickerCupertino(
backgroundColor: Colors.white,
pickerSheetHeight: 200.0,
initialCountry: _selectedFilteredCupertinoCountry,
onValuePicked: (Country country) =>
setState(() => _selectedFilteredCupertinoCountry = country),
itemFilter: (c) => ['AR', 'DE', 'GB', 'CN'].contains(c.isoCode),
);
});
Widget _buildCupertinoSelectedItem(Country country) {
return Row(
children: <Widget>[
CountryPickerUtils.getDefaultFlagImage(country),
SizedBox(width: 8.0),
Text("+${country.phoneCode}"),
SizedBox(width: 8.0),
Flexible(child: Text(country.name))
],
);
}
Widget _buildCupertinoItem(Country country) {
return DefaultTextStyle(
style: const TextStyle(
color: CupertinoColors.white,
fontSize: 16.0,
),
child: Row(
children: <Widget>[
SizedBox(width: 8.0),
CountryPickerUtils.getDefaultFlagImage(country),
SizedBox(width: 8.0),
Text("+${country.phoneCode}"),
SizedBox(width: 8.0),
Flexible(child: Text(country.name))
],
),
);
}
}
更多关于Flutter国家选择器插件country_pickers_v2的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复
更多关于Flutter国家选择器插件country_pickers_v2的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用country_pickers_v2
插件的示例代码。这个插件提供了方便的国家选择器功能。
首先,确保你的Flutter项目已经创建好,并且pubspec.yaml
文件中已经添加了country_pickers_v2
依赖:
dependencies:
flutter:
sdk: flutter
country_pickers_v2: ^0.2.0 # 请注意版本号,确保使用最新版本
然后运行flutter pub get
来获取依赖。
接下来,在你的Dart文件中,你可以按照以下方式使用country_pickers_v2
插件:
import 'package:flutter/material.dart';
import 'package:country_pickers_v2/country_pickers_v2.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String? selectedCountryCode;
String? selectedCountryName;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Country Picker Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Selected Country Code: ${selectedCountryCode ?? 'N/A'}',
style: TextStyle(fontSize: 20),
),
SizedBox(height: 20),
Text(
'Selected Country Name: ${selectedCountryName ?? 'N/A'}',
style: TextStyle(fontSize: 20),
),
SizedBox(height: 40),
ElevatedButton(
onPressed: () {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('Select a Country'),
content: CountryPicker(
onChanged: (CountryCode countryCode) {
setState(() {
selectedCountryCode = countryCode.code;
selectedCountryName = countryCode.name;
});
Navigator.of(context).pop();
},
favorite: ['+1', 'cn', 'in'], // 预选的国家代码
search: true,
),
);
},
);
},
child: Text('Select Country'),
),
],
),
),
);
}
}
代码说明:
-
依赖导入:
import 'package:country_pickers_v2/country_pickers_v2.dart';
-
UI构建:
- 使用
Scaffold
、AppBar
和Center
等组件构建基础UI。 - 使用
Text
组件显示选中的国家代码和国家名称。 - 使用
ElevatedButton
组件触发国家选择器对话框。
- 使用
-
国家选择器对话框:
- 使用
showDialog
方法显示一个AlertDialog
。 AlertDialog
的内容是一个CountryPicker
组件。CountryPicker
组件的onChanged
回调会在用户选择国家时被调用,更新选中的国家代码和国家名称。
- 使用
-
状态管理:
- 使用
StatefulWidget
和setState
方法更新UI状态。
- 使用
这个示例展示了如何使用country_pickers_v2
插件在Flutter应用中实现一个功能完整的国家选择器。你可以根据实际需求进一步定制和扩展这个示例。