Flutter 如何更改文本字段颤振内的值?
我有一个Flutter 如何更改文本字段颤振内的值?,flutter,dart,Flutter,Dart,我有一个textededitingcontroller,如果用户单击按钮,它会填写信息。我似乎不知道如何更改Textfield或TextFormField中的文本。有解决办法吗 _mytexteditingcontroller.value = new TextEditingController.fromValue(new TextEditingValue(text: "My String")).value; 如果任何人有更好的方法,请随时告诉我。只需更改文本属性即可 TextField
textededitingcontroller
,如果用户单击按钮,它会填写信息。我似乎不知道如何更改Textfield
或TextFormField
中的文本。有解决办法吗
_mytexteditingcontroller.value = new TextEditingController.fromValue(new TextEditingValue(text: "My String")).value;
如果任何人有更好的方法,请随时告诉我。只需更改
文本属性即可
TextField(
controller: txt,
),
RaisedButton(onPressed: () {
txt.text = "My Stringt";
}),
而txt
只是一个TextEditingController
var txt = TextEditingController();
您可以使用文本编辑控制器操纵文本字段内的值
var textController = new TextEditingController();
现在,创建一个新的textfield并将textController
设置为textfield的控制器,如下所示
new TextField(controller: textController)
现在,在代码中的任意位置创建一个RaisedButton
,并在RaisedButton
的onPressed
方法中设置所需的文本
new RaisedButton(
onPressed: () {
textController.text = "New text";
}
),
屏幕截图:
创建一个文本编辑控制器
:
final TextEditingController\u controller=TextEditingController();
将其分配给您的TextField
或TextFormField
:
TextField(控制器:\u控制器)
例如,使用按钮更新文本
ElevatedButton(
已按下:(){
最终yourText='Hello World';
_controller.value=\u controller.value.copyWith(
文本:你的文本,
选择:TextSelection.collapsed(偏移量:yourText.length),
);
},
)
第一件事
TextEditingController MyController= new TextEditingController();
然后将其添加到init State或任何SetState中
MyController.value = TextEditingValue(text: "ANY TEXT");
只是设置的问题
_controller.text = "New value";
光标将重新定位到起始位置(在材质的文本字段中)。使用
效率不高,因为它重建小部件的次数超过了它的需要(在设置text属性和调用setState时)
--
我认为最好的方法是将所有内容组合成一个简单的命令:
final _newValue = "New value";
_controller.value = TextEditingValue(
text: _newValue,
selection: TextSelection.fromPosition(
TextPosition(offset: _newValue.length),
),
);
它适用于Material和Cupertino文本字段。步骤1)声明TextEditingController
步骤2)向文本字段提供控制器
步骤3)更改textField值的用户控制器的text属性
遵循这个官方的这里是一个完整的示例,其中父窗口小部件控制子窗口小部件。父窗口小部件使用计数器更新子窗口小部件(文本和文本字段)
要更新文本小部件,只需传入字符串参数。
要更新TextField小部件,您需要传入一个控制器,并在控制器中设置文本
main.dart:
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Demo',
home: Home(),
);
}
}
class Home extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Update Text and TextField demo'),
),
body: ParentWidget());
}
}
class ParentWidget extends StatefulWidget {
@override
_ParentWidgetState createState() => _ParentWidgetState();
}
class _ParentWidgetState extends State<ParentWidget> {
int _counter = 0;
String _text = 'no taps yet';
var _controller = TextEditingController(text: 'initial value');
void _handleTap() {
setState(() {
_counter = _counter + 1;
_text = 'number of taps: ' + _counter.toString();
_controller.text = 'number of taps: ' + _counter.toString();
});
}
@override
Widget build(BuildContext context) {
return Container(
child: Column(children: <Widget>[
RaisedButton(
onPressed: _handleTap,
child: const Text('Tap me', style: TextStyle(fontSize: 20)),
),
Text('$_text'),
TextField(controller: _controller,),
]),
);
}
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“演示”,
home:home(),
);
}
}
类Home扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“更新文本和文本字段演示”),
),
正文:ParentWidget());
}
}
类ParentWidget扩展了StatefulWidget{
@凌驾
_ParentWidgetState createState()=>\u ParentWidgetState();
}
类_ParentWidgetState扩展状态{
int _计数器=0;
字符串_text='还没有点击';
var_controller=TextEditingController(文本:“初始值”);
void_handleTap(){
设置状态(){
_计数器=_计数器+1;
_text='点击次数:'+_counter.toString();
_controller.text='点击次数:'+_counter.toString();
});
}
@凌驾
小部件构建(构建上下文){
返回容器(
子项:列(子项:[
升起的按钮(
按下按钮:_handleTap,
child:const Text('Tap me',style:TextStyle(fontSize:20)),
),
文本(“$”文本),
TextField(控制器:_控制器,),
]),
);
}
}
只需更改控制器的文本或值。
如果不编辑选择属性,光标将转到新文本的第一个
onPress: () {
_controller.value=TextEditingValue(text: "sample text",selection: TextSelection.fromPosition(TextPosition(offset: sellPriceController.text.length)));
}
或者,如果您更改.text属性:
onPress: () {
_controller.text="sample text";
_controller.selection = TextSelection.fromPosition(TextPosition(offset:_controller.text.length));
}
如果对您来说无关紧要,只需不更改选择属性,如果您只想替换文本编辑控制器中的整个文本,那么这里的其他答案就可以了。但是,如果您希望以编程方式插入、替换选择或删除,则需要更多的代码
制作自己的自定义键盘就是一个这样的用例。以下所有插入和删除均以编程方式完成:
插入文本
\u控制器
这里是一个文本编辑控制器
,用于文本字段
void\u插入文本(字符串myText){
最终文本=_controller.text;
最终文本选择=_controller.selection;
最终newText=text.replaceRange(
textSelection.start,
textSelection.end,
我的文本,
);
最终myTextLength=myText.length;
_controller.text=newText;
_controller.selection=textSelection.copyWith(
baseOffset:textSelection.start+myTextLength,
extendtoffset:textSelection.start+myTextLength,
);
}
谢谢你的帮助
删除文本
有几种不同的情况需要考虑:
有一个选择(删除该选择)
光标位于开始处(不执行任何操作)
其他内容(删除上一个字符)
以下是实施方案:
void\u backspace(){
最终文本=_controller.text;
最终文本选择=_controller.selection;
最终选择长度=textSelection.end-textSelection.start;
//有一个选择。
如果(选择长度>0){
最终newText=text.replaceRange(
textSelection.start,
textSelection.end,
'',
);
_controller.text=newText;
_controller.selection=textSelection.copyWith(
baseOffset:textSelection.start,
extendtoffset:textSelection.s
onPress: () {
_controller.value=TextEditingValue(text: "sample text",selection: TextSelection.fromPosition(TextPosition(offset: sellPriceController.text.length)));
}
onPress: () {
_controller.text="sample text";
_controller.selection = TextSelection.fromPosition(TextPosition(offset:_controller.text.length));
}