Flutter国际化手机号码输入插件intl_mobile_field的使用

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

Flutter国际化手机号码输入插件intl_mobile_field的使用

International Mobile Number Field Package

pub package License: MIT

这是一个定制的Flutter TextFormField,用于输入带有国家代码的国际手机号码。该包受intl_phone_field启发,但原包自2023年中以来未进行更新维护。因此我们决定创建一个新包,包含更多功能,使其更加灵活和兼容。如果您想了解该包的更新内容,请查阅CHANGELOG.md文件。

Installing

要使用这个包:

  • 运行命令:
    flutter pub add intl_mobile_field
    
  • 或者,在您的pubspec.yaml文件中添加以下内容:
    dependencies:
      intl_mobile_field: ^<latest_version>
    

有时您可能想要使用最新版本的包,而不是已发布的版本。为此,请使用git语法:

dependencies:
  intl_mobile_field:
    git:
      url: https://github.com/MdAshrafUllah/intl_mobile_field.git
      ref: master

How to Use

简单地创建一个IntlMobileField widget,并传递所需的参数即可。

示例1(无收藏)

IntlMobileField(
  decoration: const InputDecoration(
    labelText: 'Mobile Number',
    border: OutlineInputBorder(
      borderSide: BorderSide(),
    ),
  ),
  initialCountryCode: 'BD',
  disableLengthCounter: true,
  languageCode: "en",
),

示例2(有收藏 - 样式一)

IntlMobileField(
  favorite: const ['BD', 'US', 'MY'],
  favoriteIcon: Icon(
    Icons.star,
    color: Colors.amber,
  ),
  favoriteIconIsLeft: false,
  decoration: const InputDecoration(
    labelText: 'Mobile Number',
    border: OutlineInputBorder(
      borderSide: BorderSide(),
    ),
  ),
  initialCountryCode: 'BD',
  disableLengthCounter: true,
  languageCode: "en",
  onChanged: (mobile) {
    log(mobile.completeNumber);
  },
  onCountryChanged: (country) {
    log('Country changed to: ${country.name}');
  },
),

示例3(有收藏 - 样式二)

IntlMobileField(
  favorite: const ['BD', 'US', 'MY'],
  favoriteIcon: Icon(
    Icons.favorite,
    color: Colors.pinkAccent,
  ),
  countryCodePositionRight: false,
  favoriteIconIsLeft: false,
  decoration: const InputDecoration(
    labelText: 'Mobile Number',
    border: OutlineInputBorder(
      borderSide: BorderSide(),
    ),
  ),
  pickerDialogStyle: PickerDialogStyle(
      countryCodeStyle:
          TextStyle(fontSize: 16, fontWeight: FontWeight.bold)),
  initialCountryCode: 'BD',
  disableLengthCounter: true,
  languageCode: "en",
),

对于PickerDialogStyle,您需要从import 'package:intl_mobile_field/country_picker_dialog.dart';导入它。

完整示例Demo

下面是一个完整的示例demo,展示了如何在项目中集成并使用IntlMobileField组件。

import 'dart:developer';

import 'package:flutter/material.dart';
import 'package:intl_mobile_field/intl_mobile_field.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final GlobalKey<FormState> _formKey = GlobalKey();
  final TextEditingController controller = TextEditingController();

  FocusNode focusNode = FocusNode();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Mobile Field Example'),
          backgroundColor: Colors.blueAccent,
          foregroundColor: Colors.white,
          centerTitle: true,
        ),
        body: Padding(
          padding: const EdgeInsets.symmetric(horizontal: 16.0),
          child: Form(
            key: _formKey,
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                const SizedBox(height: 30),
                const TextField(
                  decoration: InputDecoration(
                    labelText: 'Name',
                    border: OutlineInputBorder(
                      borderSide: BorderSide(),
                    ),
                  ),
                ),
                const SizedBox(
                  height: 10,
                ),
                const TextField(
                  decoration: InputDecoration(
                    labelText: 'Email',
                    border: OutlineInputBorder(
                      borderSide: BorderSide(),
                    ),
                  ),
                ),
                const SizedBox(
                  height: 10,
                ),
                IntlMobileField(
                  favorite: const ['BD', 'US', 'MY'],
                  favoriteIcon: Icon(
                    Icons.star,
                    color: Colors.amber,
                  ),
                  favoriteIconIsLeft: false,
                  decoration: const InputDecoration(
                    labelText: 'Mobile Number',
                    border: OutlineInputBorder(
                      borderSide: BorderSide(),
                    ),
                  ),
                  initialCountryCode: 'BD',
                  disableLengthCounter: true,
                  languageCode: "en",
                  onChanged: (mobile) {
                    log(mobile.completeNumber);
                  },
                  onCountryChanged: (country) {
                    log('Country changed to: ${country.name}');
                  },
                ),
                const SizedBox(
                  height: 10,
                ),
                Center(
                  child: SizedBox(
                    height: 50,
                    width: double.infinity,
                    child: MaterialButton(
                      shape: ContinuousRectangleBorder(
                          borderRadius: BorderRadius.circular(15)),
                      color: Colors.blue,
                      textColor: Colors.white,
                      onPressed: () {
                        log(controller.text);
                        _formKey.currentState?.validate();
                      },
                      child: const Text(
                        'Submit',
                        style: TextStyle(
                          fontSize: 20,
                        ),
                      ),
                    ),
                  ),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

以上是关于intl_mobile_field插件的详细使用说明,希望对您有所帮助!如果您有任何问题或建议,欢迎随时提出。


更多关于Flutter国际化手机号码输入插件intl_mobile_field的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter国际化手机号码输入插件intl_mobile_field的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter应用中使用intl_mobile_field插件来实现国际化手机号码输入的示例代码。这个插件能够帮助你快速实现电话号码格式化和验证功能,支持多种语言和地区的号码格式。

首先,你需要在你的pubspec.yaml文件中添加这个插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  intl_mobile_field: ^0.5.0  # 请注意版本号,确保使用最新版本

然后,运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter应用中使用这个插件。以下是一个简单的示例,展示了如何在一个页面中集成国际化手机号码输入功能:

import 'package:flutter/material.dart';
import 'package:intl_mobile_field/intl_mobile_field.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Intl Mobile Field Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final _formKey = GlobalKey<FormState>();
  String? phoneNumber;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Intl Mobile Field Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Form(
          key: _formKey,
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              IntlMobileField(
                labelText: 'Phone Number',
                initialCountry: 'us',  // 初始国家代码,可以是 'us', 'cn', 'in' 等
                onChanged: (value) {
                  setState(() {
                    phoneNumber = value;
                  });
                },
                validator: (value) {
                  if (value == null || value.isEmpty) {
                    return 'Phone number is required';
                  }
                  return null;
                },
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () {
                  if (_formKey.currentState!.validate()) {
                    // 处理表单提交
                    print('Phone Number: $phoneNumber');
                  }
                },
                child: Text('Submit'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个表单,表单中使用了IntlMobileField组件来输入国际化手机号码。以下是代码的主要部分:

  1. IntlMobileField

    • labelText:输入框的标签文本。
    • initialCountry:设置初始的国家代码,例如 'us' 表示美国。
    • onChanged:当输入的电话号码发生变化时,会调用这个回调函数,并将当前的电话号码作为参数传递。
    • validator:用于表单验证的回调函数,如果电话号码为空或无效,则返回一个错误消息字符串;否则返回null
  2. ElevatedButton:提交按钮,当点击按钮时,会调用_formKey.currentState!.validate()方法来验证表单。如果验证通过,则打印出输入的电话号码。

通过这种方式,你可以很方便地在Flutter应用中实现国际化手机号码输入功能。插件还提供了更多的配置选项,例如自定义样式、显示国旗图标等,你可以根据需求进行进一步的配置。

回到顶部