颤振如何使文本字段中的光标停止移动到开头?

时间:2019-07-03 14:48:07

标签: flutter dart

我在text field应用程序中有一个flutter,该应用程序旨在让用户编辑数据。当TextField出现时,它已经有数据了,可以正常工作。问题在于,当用户将光标放在TextField的末尾或其中的任何地方并开始键入时,光标会移回开头,有时会删除第一个或两个单词。

我尝试将对函数的调用放在setState内,这没有帮助。如果我完全不使用控制器,问题就消失了,但是当他们在框外单击时,我无法保存他们的输入。

这是文本字段的代码,它在“更改”上

TextField(
    decoration: InputDecoration(
       border: InputBorder.none
    ),
    controller: controller,
    autofocus: true,
    onChanged: (text) {
       controller..text = text;
       controller..selection = TextSelection.collapsed(offset: controller.text.length);
    },
    maxLines: 8,
  

这是我创建控制器的地方

 TextEditingController controller = new TextEditingController();
 controller.text = *initial text here*;
  

这是扑扑的医生

[√] Flutter (Channel stable, v1.5.4-hotfix.2, on Microsoft Windows [Version 10.0.17134.829], locale en-US)
    • Flutter version 1.5.4-hotfix.2 at C:\Users\jhall\Desktop\flutter
    • Framework revision 7a4c33425d (9 weeks ago), 2019-04-29 11:05:24 -0700
    • Engine revision 52c7a1e849
    • Dart version 2.3.0 (build 2.3.0-dev.0.5 a1668566e5)

[√] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
    • Android SDK at C:\Users\jhall\AppData\Local\Android\sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-Q, build-tools 28.0.3
    • Java binary at: C:\Program Files\Android\Android Studio1\jre\bin\java
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1343-b01)
    • All Android licenses accepted.
[√] Android Studio (version 3.4)
    • Android Studio at C:\Program Files\Android\Android Studio1
    • Flutter plugin version 35.3.1
    • Dart plugin version 183.6270
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1343-b01)
[√] VS Code, 64-bit edition (version 1.24.1)
    • VS Code at C:\Program Files\Microsoft VS Code
    • Flutter extension version 2.21.1
[√] Connected device (1 available)
    • Android SDK built for x86 • emulator-5554 • android-x86 • Android 9 (API 28) (emulator)
• No issues found!

因此,我基本上只需要您希望从文本输入字段中获得的正常功能,以便用户能够将光标放置在所需的位置并键入。

我尝试一起摆脱on Change,问题仍然存在。

4 个答案:

答案 0 :(得分:0)

我认为,只要从代码中删除onChange,您就可以得到所需的内容!

重要的一件事也可能导致问题,那就是控制器必须设置一次!您可以将其放在窗口小部件状态的构造函数中或initState()中。会是这样的:

import 'package:flutter/material.dart';

class MyStatefulPage extends StatefulWidget {
  @override
  State<MyStatefulPage> createState() {
    return _MyStatefulPageState();
  }
}
class _MyStatefulPageState extends State<MyStatefulPage> {

  TextEditingController controller;

  @override
  void initState() {
    super.initState();
    controller = new TextEditingController();
    controller.text = 'My Initial Text';
  } 

  @override
  Widget build(BuildContext context) {
    return TextField(
      decoration: InputDecoration(
       border: InputBorder.none
      ),
      controller: controller,
      autofocus: true,
      maxLines: 8,
    );
  }
}

答案 1 :(得分:0)

您可以在更改文本之前捕获光标位置,然后将光标位置重新应用于新文本:

for line in range(1, int(move_line.qty_done) + 1 ): #qty_done here is 230.000
    val = {
        'name': line.name,....some data here}
    self.env['model'].create(val)

答案 2 :(得分:0)

您不必这样做

controller..text = text;

onChanged内部,因为一旦将其连接到TextField,控制器的文本就会自动更改。

原因是,一旦您将某些文本设置为controller,它就会re-applies文本,从而将光标移到前面。

您的情况:

TextField(
    decoration: InputDecoration(
       border: InputBorder.none
    ),
    controller: controller,
    autofocus: true,
    onChanged: (text) {
    },
    maxLines: 8,)

应该解决问题。

答案 3 :(得分:0)

onChanged: (text) {
   TextSelection previousSelection = controller.selection;
   controller.text = text;
   controller.selection = previousSelection;
}

正在工作!谢谢@ wz366!