Flutter电话号码输入增强插件extended_phone_number_input的使用
Flutter电话号码输入增强插件extended_phone_number_input的使用
extended_phone_number_input
是一个高度可定制的Flutter小部件,用于电话号码输入。它支持国际验证、国家代码选择、联系人选择等功能。
Features
- 支持国际电话号码验证
- 可以仅包含特定国家/地区
- 可以排除特定国家/地区
- 使用控制器设置电话号码(所选国家将自动更新)
- 从联系人列表中选择电话号码
Getting Started
要开始使用 extended_phone_number_input
插件,请确保你已经安装了该插件:
flutter pub add extended_phone_number_input
如果你的目标是Android 11+ (API 30+) 并且想要使用内置的联系人选择器,你需要在 AndroidManifest.xml
中添加 android.permission.READ_CONTACTS
权限,因为此权限会自动请求。
Usage
下面是一些使用示例和配置方法。
Simple Usage
最简单的用法如下:
PhoneNumberInput(initialCountry: 'SA', locale: 'ar')
Show Countries as Dialog
默认情况下,国家列表是以底部弹出窗口显示的。如果你想改为对话框模式,可以这样做:
const PhoneNumberInput(
initialCountry: 'US',
locale: 'en',
countryListMode: CountryListMode.dialog,
contactsPickerPosition: ContactsPickerPosition.suffix,
)
Custom Borders
你可以自定义输入框的边框样式:
PhoneNumberInput(
initialCountry: 'TN',
locale: 'fr',
countryListMode: CountryListMode.dialog,
contactsPickerPosition: ContactsPickerPosition.suffix,
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
borderSide: const BorderSide(color: Colors.purple)),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
borderSide: const BorderSide(color: Colors.purple))
)
Select Phone Number Programmatically
为了能够编程方式选择电话号码,首先需要定义一个 PhoneInputController
:
PhoneInputController _controller = PhoneInputController(context);
PhoneNumberInput(
controller: _controller,
// ...其他配置项
)
// 设置电话号码
_controller.phoneNumber = '+1-....'
注意:如果你想要从联系人中设置电话号码,该插件已经内置了这个功能,无需使用控制器。
完整示例 Demo
以下是一个完整的演示代码,展示了如何在Flutter应用中集成并使用 extended_phone_number_input
:
import 'package:extended_phone_number_input/consts/enums.dart';
import 'package:extended_phone_number_input/phone_number_controller.dart';
import 'package:extended_phone_number_input/phone_number_input.dart';
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Phone Number Input'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const SizedBox(height: 20),
const Text('Bottom Sheet Mode'),
const PhoneNumberInput(
initialCountry: 'SA',
locale: 'it',
countryListMode: CountryListMode.bottomSheet,
contactsPickerPosition: ContactsPickerPosition.suffix,
),
const SizedBox(height: 50),
const Text('Dialog Mode'),
const PhoneNumberInput(
initialCountry: 'SA',
locale: 'it',
countryListMode: CountryListMode.dialog,
contactsPickerPosition: ContactsPickerPosition.suffix,
),
const SizedBox(height: 50),
const Text('Custom Border & Controller'),
PhoneNumberInput(
initialCountry: 'TN',
locale: 'ar',
controller: PhoneNumberInputController(context),
countryListMode: CountryListMode.dialog,
contactsPickerPosition: ContactsPickerPosition.suffix,
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
borderSide: const BorderSide(color: Colors.purple)),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
borderSide: const BorderSide(color: Colors.purple)),
errorText: 'error',
),
const SizedBox(height: 50),
const Text('Bottom Picker Widget with Custom Widget'),
const PhoneNumberInput(
initialCountry: 'YE',
locale: 'it',
countryListMode: CountryListMode.dialog,
contactsPickerPosition: ContactsPickerPosition.bottom,
pickContactIcon: Card(
color: Colors.blueGrey,
child: Padding(
padding: EdgeInsets.all(10.0),
child: Text(
'Select from contacts',
style: TextStyle(color: Colors.white),
),
),
),
),
const SizedBox(height: 50),
const Text('Custom Picker Icon, No Flag, Hint'),
const PhoneNumberInput(
locale: 'it',
countryListMode: CountryListMode.bottomSheet,
contactsPickerPosition: ContactsPickerPosition.suffix,
pickContactIcon: Icon(Icons.add),
showSelectedFlag: false,
hint: 'XXXXXXXXXXX',
),
],
),
),
),
);
}
}
通过上述代码,您可以体验到 extended_phone_number_input
的各种特性,并根据需求进行调整。希望这些信息对您有所帮助!如果有任何问题或需要进一步的帮助,请随时提问。
更多关于Flutter电话号码输入增强插件extended_phone_number_input的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter电话号码输入增强插件extended_phone_number_input的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用extended_phone_number_input
插件来增强电话号码输入的示例代码。
首先,你需要在你的pubspec.yaml
文件中添加extended_phone_number_input
依赖项:
dependencies:
flutter:
sdk: flutter
extended_phone_number_input: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装依赖项。
接下来是一个简单的示例,展示了如何使用extended_phone_number_input
插件:
import 'package:flutter/material.dart';
import 'package:extended_phone_number_input/extended_phone_number_input.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Phone Number Input Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: PhoneNumberInputScreen(),
);
}
}
class PhoneNumberInputScreen extends StatefulWidget {
@override
_PhoneNumberInputScreenState createState() => _PhoneNumberInputScreenState();
}
class _PhoneNumberInputScreenState extends State<PhoneNumberInputScreen> {
final _formKey = GlobalKey<FormState>();
PhoneNumber? _selectedPhoneNumber;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Phone Number Input'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
ExtendedPhoneNumberInput(
decoration: InputDecoration(
labelText: 'Enter your phone number',
),
initialCountry2LetterCode: 'US', // 默认国家代码
favorite: ['+1', 'CN', 'IN'], // 收藏的国家代码
onChanged: (phone) {
setState(() {
_selectedPhoneNumber = phone;
});
},
onError: (error) {
print('Error: $error');
},
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
if (_formKey.currentState!.validate()) {
// 在这里处理提交逻辑
print('Selected Phone Number: ${_selectedPhoneNumber?.e164Number}');
}
},
child: Text('Submit'),
),
],
),
),
),
);
}
}
代码说明
- 依赖项添加:在
pubspec.yaml
中添加extended_phone_number_input
依赖项。 - MaterialApp:创建一个基本的Flutter应用。
- PhoneNumberInputScreen:创建一个包含电话号码输入表单的页面。
- ExtendedPhoneNumberInput:使用
ExtendedPhoneNumberInput
小部件来输入电话号码。decoration
:定义输入装饰,包括标签文本。initialCountry2LetterCode
:设置默认的国家代码。favorite
:设置收藏的国家代码列表。onChanged
:当电话号码变化时回调,更新状态。onError
:当输入错误时回调,这里简单打印错误信息。
- ElevatedButton:创建一个提交按钮,在按钮点击时验证表单并处理提交逻辑。
这个示例展示了如何使用extended_phone_number_input
插件来创建一个增强型的电话号码输入表单,包括选择国家代码和格式化电话号码输入。希望这对你有所帮助!