文本编辑控制器堆栈溢出在键入时出错



这是最小的可重现代码:

final _controller = TextEditingController();
@override
void initState() {
super.initState();
_controller.addListener(() {
var input = _controller.text;
_controller.text = input; // A
_controller.selection = TextSelection.fromPosition(TextPosition(offset: 0)); // B
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(child: TextField(controller: _controller)),
);
}

一旦您开始在TextField中键入任何内容,就会出现堆栈溢出错误。如果您注释掉两行中的任何一行AB,它就可以工作。不知道我做错了什么。

错误:

[VERBOSE-2:ui_dart_state.cc(166)] Unhandled Exception: Stack Overflow
#0      _HashVMBase._data (dart:collection-patch/compact_hash.dart:61:3)
#1      _LinkedHashMapMixin.keys (dart:collection-patch/compact_hash.dart:382:37)
#2      _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:373:14)
#3      _JsonStringifier.writeMap (dart:convert/json.dart:753:9)
#4      _JsonStringifier.writeJsonValue (dart:convert/json.dart:723:21)
#5      _JsonStringifier.writeObject (dart:convert/json.dart:678:9)
#6      _JsonStringifier.writeMap (dart:convert/json.dart:768:7)
#7      _JsonStringifier.writeJsonValue (dart:convert/json.dart:723:21)
#8      _JsonStringifier.writeObject (dart:convert/json.dart:678:9)
#9      _JsonStringStringifier.printOn (dart:convert/json.dart:876:17)
#10     _JsonStringStringifier.stringify (dart:convert/json.dart:861:5)
#11     JsonEncoder.convert (dart:convert/json.dart:261:30)
#12     JsonCodec.encode (dart:convert/json.dart:171:45)
#13     JSONMessageCodec.encodeMess<…>

有点晚了,但也许其他人也像我一样面临同样的问题。

我通过删除侦听器、更新控制器值并再次添加侦听器来解决它,如下所示:

final _controller = TextEditingController();
void _onChange(){
var input = _controller.text;
_controller.removeListener(_onChange);
_controller.text = input; // A
_controller.selection = TextSelection.fromPosition(TextPosition(offset: 0)); // B
_controller.addListener(_onChange);
}
@override
void initState() {
super.initState();
_controller.addListener(_onChane);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(child: TextField(controller: _controller)),
);
}

因此,_onChange方法不能调用自身并导致无限循环,这是我错误的原因。

编辑

问题是您在文本更改时创建一个循环, 例如:

  • 文本更改为"z">
  • 侦听器通知值为"z">
  • 使用"Z"设置控制器文本
  • 再次通知侦听器,值为"z">

像这样更改代码:

final _controller = TextEditingController();

@override
void initState() {
super.initState();
_controller.addListener(() {
_controller.selection =
TextSelection.fromPosition(TextPosition(offset: 0)); // B
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(child: TextField(controller: _controller)),
);
}

相关内容

最新更新