Flutter TextField实现银行卡号输入

495 阅读1分钟

Flutter TextField实现银行卡号输入

QQ图片20220307134416.jpg

class TestPage extends StatefulWidget {
  @override
  _TestPageState createState() => new _TestPageState();
}

class _TestPageState extends State<TestPage> {
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Column(
        children: [
          Container(
            margin: EdgeInsets.symmetric(horizontal: 50),
            child: TextField(
              keyboardType: TextInputType.number,
              inputFormatters: [
                CardInputFormatter(),
              ],
            ),
          ),
        ],
      ),
    );
  }
}

自定义TextInputFormatter限制输入内容

class CardInputFormatter extends TextInputFormatter {
  @override
  TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) {
    int newSelection = newValue.selection.baseOffset;
    int oldSelection = oldValue.selection.baseOffset;

    String newText = newValue.text;
    String oldText = oldValue.text;

    String pureNumbers = newText.replaceAll(RegExp(r'[^0-9]'), '');
    String cardNumbers = "";

    //每四位数中间插入空格
    for (var i = 0; i < pureNumbers.length; i++) {
      if (i > 0 && i % 4 == 0) {
        cardNumbers += ' ';
      }
      cardNumbers += pureNumbers[i];
    }

    //光标位置
    int selection;
    if (cardNumbers.length == oldText.length) {
      //文字长度没有变化
      selection = newSelection;
    } else {
      selection = oldSelection + cardNumbers.length - oldText.length;
    }

    return TextEditingValue(
      text: cardNumbers,
      selection: TextSelection.collapsed(offset: selection),
    );
  }
}