我有一个TextEditingController
,如果用户单击某个按钮,则会在其中填充信息。我似乎无法弄清楚如何在Textfield
或TextFormField
内更改文本。有解决办法吗?
答案 0 :(得分:24)
只需更改text
属性
new TextField(
controller: txt,
),
new RaisedButton(onPressed: () {
setState(() {
txt.text = "My Stringt";
});
}),
而txt
只是TextEditingController
var txt = new TextEditingController();
答案 1 :(得分:5)
_mytexteditingcontroller.value = new TextEditingController.fromValue(new TextEditingValue(text: "My String")).value;
如果有人有更好的方法,这似乎可行,请随时告诉我。
答案 2 :(得分:4)
您可以使用文本编辑控制器来操纵文本字段中的值。
var textController = new TextEditingController();
现在,创建一个新的文本字段,并将textController
设置为该文本字段的控制器,如下所示。
new TextField(controller: textController)
现在,在代码中的任意位置创建一个RaisedButton
,并在onPressed
的{{1}}方法中设置所需的文本。
RaisedButton
答案 3 :(得分:3)
设置问题
_controller.text = "New value";
是将光标重新定位到开头(在材质的TextField中)。使用
_controller.text = "Hello";
_controller.selection = TextSelection.fromPosition(
TextPosition(offset: _controller.text.length),
);
setState(() {});
效率不高,因为它会重新构建窗口小部件,超出了必要(在设置text属性和调用setState时)。
-
我相信最好的方法是将所有内容组合成一个简单的命令:
final _newValue = "New value";
_controller.value = TextEditingValue(
text: _newValue,
selection: TextSelection.fromPosition(
TextPosition(offset: _newValue.length),
),
);
它同时适用于Material和Cupertino文本字段。
答案 4 :(得分:1)
第一件事
TextEditingController MyController= new TextEditingController();
然后将其添加到初始化状态或任何SetState
MyController.value = TextEditingValue(text: "ANY TEXT");
答案 5 :(得分:1)
步骤1)声明TextEditingController。
第2步)为文本字段提供控制器。
步骤3)用户控制器的text属性,以更改textField的值。
答案 6 :(得分:1)
这是一个完整示例,其中父窗口小部件控制子窗口小部件。父窗口小部件使用计数器更新子窗口小部件( Text 和 TextField )。
要更新 Text 小部件,只需输入 String 参数即可。 要更新 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,),
]),
);
}
}
答案 7 :(得分:1)
只需更改控制器的text or value
属性。
如果您不编辑选择属性,则光标将移至新文本的第一行。
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));
}
在与您无关的情况下,请勿更改选择属性
答案 8 :(得分:0)
使用此解决方案,您还可以将光标放在新文本的结尾。
final TextEditingController _controller = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(child: TextField(controller: _controller)),
floatingActionButton: FloatingActionButton(
onPressed: () {
_controller.text = "Hello";
// this changes cursor position
_controller.selection = TextSelection.fromPosition(TextPosition(offset: _controller.text.length));
setState(() {});
},
),
);
}
答案 9 :(得分:0)
TextEditingController()..text = "new text"
答案 10 :(得分:0)
如果您将 StatefulWidget
与 _controller
作为成员一起使用,则不会出现此问题。听起来很奇怪,但从无状态到有状态的工作很好(这是因为小部件在每个输入到文本编辑控制器的输入上都重新绘制,它不保留状态)例如:
有状态:(工作)
class MyWidget extends StatefulWidget {
const MyWidget(
{Key? key})
: super(key: key);
@override
_MyWidgetState createState() =>
_MyWidgetState();
}
class _MyWidgetState
extends State<MyWidget> {
late TextEditingController _controller;
@override
void initState() {
super.initState();
_controller = TextEditingController(text: "My Text");
}
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextField(
controller: _controller,
),
],
);
}
}
无状态:(问题)
class MyWidget extends StatelessWidget {
const MyWidget(
{Key? key})
: super(key: key);
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextField(
controller: TextEditingController(text: "My Text"),
),
],
);
}
}