我在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,问题仍然存在。
答案 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!