Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何更改文本字段颤振内的值?_Flutter_Dart - Fatal编程技术网

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));          
                  }