使用初始值或控制器设置初始文本时,Flutter TexField和TextFormField复制文本

时间:2018-10-19 14:31:45

标签: android flutter

在具有TextField或TextFormField的flutter应用程序中,首次输入数据时可以复制文本。

第一次输入按键时,在已经预先填充文本的字段中,文本会重复,然后附加您的按键。

我在我的Samsung Galaxy S7,S8和S9(仅需要测试的设备)上遇到了表现出此行为的东西。在模拟器(Galaxy Nexus9和Pixel 2)中不会发生这种情况。

如果我在该字段的末尾放置一个空格,则不会发生此问题,但是,如果我在一个预填充字段的中间轻按(使用控制器或initialValue)并按一个键,则会发生此问题。

这里是准系统示例:

class SampleTextFormPage extends StatefulWidget {
    @override
    State<StatefulWidget> createState() => new _SampleTextFormPage();
}

class _SampleTextFormPage extends State<SampleTextFormPage> {
    final _scaffoldKey = new GlobalKey<ScaffoldState>();

    TextEditingController _txtController;

    @override
    void initState() {
        super.initState();

        _txtController = TextEditingController(text:'Using Controller');
    }

    @override
    Widget build(BuildContext context) { Scaffold scaffold = new Scaffold(
        key: _scaffoldKey,
        appBar: new AppBar(
            title: new Text('Text Entry',
                style: const TextStyle(
                    color: Colors.white)
            ),
            backgroundColor: Colors.indigo
        ),
        body:  Column(children: [
            //field 1
            TextField(
                 autocorrect: false,
                 autofocus: true,
                 controller: _txtController,
            ),

           //field 2
           TextFormField(
               autocorrect: false,
               autofocus: true,
               initialValue: 'Using initialValue',
           )
        ])
    );

    return scaffold;
    }
}

注意:我使用的是Flutter的最新版本,并且我已经恢复到Flutter的多个版本(一直到支持Dart 2的第一个版本),这个问题仍然存在。

2 个答案:

答案 0 :(得分:4)

如@ {DarkNeuron所述,这是三星设备上已知的Flutter问题。暂时还没有完全治愈的方法。

截至2020年2月,已确定问题与三星键盘缓存过程有关并且已自动更正。在Flutter github中,提出了可能的临时解决方法:将keyboardType: TextInputType.visiblePassword用于所有文本输入。但是有报告说,至少对于朝鲜语是无效的。另一个建议是检查三星设备并相应地构建:

keyboardType: samsungKeyboard ? TextInputType.visiblePassword : TextInputType.emailAddress,
autoFocus: false,

问题的一部分(标点重复)在两周前修复。但是问题的主要部分仍然被观察到。

您可以在这里找到更多详细信息:Flutter github

答案 1 :(得分:0)

我遇到了同样的问题并用这个简单的临时解决方案修复了它:只需在 initialValue 的末尾添加一个空格。示例:

initialValue: controller.text + ' ',