如何更改文本字段颤动内部的值?

时间:2018-07-01 21:46:24

标签: dart widget flutter textfield

我有一个TextEditingController,如果用户单击某个按钮,则会在其中填充信息。我似乎无法弄清楚如何在TextfieldTextFormField内更改文本。有解决办法吗?

11 个答案:

答案 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的值。

关注此官方solution to the problem

答案 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"),
        ),
      ],
    );
  }
}