flutter - 打字时TextEditingController stackoverflow错误
问题描述
这是最小的可重现代码:
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
,就会出现 stackoverflow 错误。如果您注释掉这两行中的任何一行A
或B
,它就会起作用。不知道我做错了什么。
错误:
[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<…>
解决方案
编辑
问题是您在文本更改时创建了一个循环,例如:
- 文本更改为“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)),
);
}
推荐阅读
- python - 在 pc 上运行良好的 opencv 代码在 mac 上无法运行
- reactjs - 为什么 App.js 中的状态更改会导致组件重新挂载?
- php - 如何在谷歌地方获得星级评分
- javascript - Three.js - 在缩放时保持对象静态
- windows - 带有 Windows 身份验证的 WCF 服务不会拒绝不受信任的用户
- c# - 如何在自己的代码中模仿(单参数)重载解析规则?
- asp.net - 在 cshtml 中使用 cshtml.cs 中的 List
- json - 如何从 JSON API 解析和存储前一天
- php - 我的布尔代码无法通知错误的用户名和密码
- python - 他们如何在 Django 项目的 python 控制台中运行这些命令?