在 setState 之后 TextField 的 Flutter Cursor 移动到位置 0

jul*_*000 3 setstate dart flutter

每当 TextFields 文本更改时,我都想在文本中显示某些内容:

class _MyPageState extends State<MyPage> {

String name;

@override
  Widget build(BuildContext context) {
      TextEditingController c = new TextEditingController(text: name);
      c.addListener(() {
         setState(() { name = c.text;});
      });
      return Scaffold(
         body: Center(
            child: Column(children: [ 
               Text('Hello, ' + name + '!'),
               TextField(controller: c)
      ])));
  }
}
Run Code Online (Sandbox Code Playgroud)

文本按预期更新,但问题是每次输入字符时,文本字段的光标都会移动到位置 0。

msk*_*ick 5

问题是您TextEditingController每次重建小部件时都会创建一个新的。正在根据输入的每个字符重建小部件。

您只需要移动TextEditingController小部件构建功能的外部。并且还移动c.addListener到小部件的initState功能。这种方式TextEditingController只创建了一次,并且只添加了一次监听器。

PS:处置小部件时处置您的控制器也很好

class MyPage extends StatefulWidget {
  @override
  _MyPageState createState() => _MyPageState();
}

class _MyPageState extends State<MyPage> {
  String name = '';
  TextEditingController c = new TextEditingController();

  @override
  void initState() {
    c.addListener(() {
      setState(() {
        name = c.text;
      });
    });
    super.initState();
  }

  @override
  void dispose() {
    c.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Center(
            child: Column(children: [
      Text('Hello, ' + name + '!'),
      TextField(controller: c)
    ])));
  }
}
Run Code Online (Sandbox Code Playgroud)