Flutter电话号码输入增强插件extended_phone_number_input的使用

发布于 1周前 作者 itying888 来自 Flutter

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

1 回复

更多关于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'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

代码说明

  1. 依赖项添加:在pubspec.yaml中添加extended_phone_number_input依赖项。
  2. MaterialApp:创建一个基本的Flutter应用。
  3. PhoneNumberInputScreen:创建一个包含电话号码输入表单的页面。
  4. ExtendedPhoneNumberInput:使用ExtendedPhoneNumberInput小部件来输入电话号码。
    • decoration:定义输入装饰,包括标签文本。
    • initialCountry2LetterCode:设置默认的国家代码。
    • favorite:设置收藏的国家代码列表。
    • onChanged:当电话号码变化时回调,更新状态。
    • onError:当输入错误时回调,这里简单打印错误信息。
  5. ElevatedButton:创建一个提交按钮,在按钮点击时验证表单并处理提交逻辑。

这个示例展示了如何使用extended_phone_number_input插件来创建一个增强型的电话号码输入表单,包括选择国家代码和格式化电话号码输入。希望这对你有所帮助!

回到顶部