首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用TextSelection将光标放在TextField的末尾

使用TextSelection将光标放在TextField的末尾
EN

Stack Overflow用户
提问于 2020-05-23 01:47:53
回答 1查看 59关注 0票数 0

我想在TextField上实现一个简单的验证。我的方法是侦听TextFieldonChange事件,应用我的验证,将值设置为controller.text,并将controller.selection设置为先前设置的值的长度。

Dartpad

由于某些原因,对于123456789的输入,TextField会生成864213579。在书写即将到来的字符时在开头和结尾之间交替。使用debugPrint,我可以断言选择应该始终位于输入的末尾。

这里的问题可能是什么?

EN

回答 1

Stack Overflow用户

发布于 2020-05-23 02:26:07

为什么不使用TextInputFormatter呢?

这就是代码。

代码语言:javascript
复制
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

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

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

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  var controller = TextEditingController();
  final _amountValidator = RegExInputFormatter.withRegex('^\$|^(0|([1-9][0-9]{0,}))(\\.[0-9]{0,})?\$');

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(''),
      ),
      body: Builder(
        builder: (context) {
          return 
            Column(
          children: <Widget>[
            TextField(
            inputFormatters: [_amountValidator],
            controller: controller,
            keyboardType: TextInputType.numberWithOptions(
              decimal: true,
              signed: false,
            ),           
          ),
            FlatButton(
              onPressed:(){
                print(controller.text);
              },
              child:Text("Test"),
            )
            ],
          );
        },
      ),
    );
  }
}






class RegExInputFormatter implements TextInputFormatter {
  final RegExp _regExp;

  RegExInputFormatter._(this._regExp);

  factory RegExInputFormatter.withRegex(String regexString) {
    try {
      final regex = RegExp(regexString);
      return RegExInputFormatter._(regex);
    } catch (e) {
      // Something not right with regex string.
      assert(false, e.toString());
      return null;
    }
  }

  @override
  TextEditingValue formatEditUpdate(
      TextEditingValue oldValue, TextEditingValue newValue) {
    final oldValueValid = _isValid(oldValue.text);
    final newValueValid = _isValid(newValue.text);
    if (oldValueValid && !newValueValid) {
      return oldValue;
    }
    return newValue;
  }

  bool _isValid(String value) {
    try {
      final matches = _regExp.allMatches(value);
      for (Match match in matches) {
        if (match.start == 0 && match.end == value.length) {
          return true;
        }
      }
      return false;
    } catch (e) {
      // Invalid regex
      assert(false, e.toString());
      return true;
    }
  }
}

参考:Flutter TextField input only decimal numbers

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61960921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档