我正在寻找有关TextEditingController优于TextField的OnChanged事件的更好解释。
我的理解是,onChanged的setState会将状态变量值的更改通知所有小部件。这样,任何小部件(例如文本)都可以简单地使用状态变量,并且会收到有关其更改的通知。
我错误的希望是TextEditingController可以使我甚至不需要状态变量变得更加简单。如下所示:
import "package:flutter/material.dart";
class TestForm extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return TestFormState();
}
}
class TestFormState extends State<TestForm> {
//string myStateVariable = "";
final ctrl = TextEditingController();
@override
Widget build(BuildContext context) {
var tf = TextField(
controller: ctrl,
);
var t = Text("Current value: " + ctrl.text); // <<<<<<<<<<< false hope! doesnt work!
var x = Column(children: <Widget>[tf,t],);
return MaterialApp(home: Material(child: Scaffold(
appBar: AppBar(title: Text("Test Form"),),
body: x,
)));
}
}
谁能解释为什么TextEditingController或类似的东西不能管理状态本身,并通知所有使用者状态改变?
谢谢。
最佳答案
没错您只是不同步设置状态而已。这种方法完全可以实现onChanged
的功能:
class _TestFormState extends State<TestForm> {
TextEditingController controller;
@override
void initState() {
controller = TextEditingController();
controller.addListener(() {
setState(() {});
});
super.initState();
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
Text('Current Value: ${controller.text}'),
TextField(
controller: controller,
),
],
);
}
}
如您所见,每次 Controller 状态更改时,我们都有一个侦听器,用于监听设置状态。这正是
onChanged
所做的。编辑:因此,关于 yield ,您可以通过两种方法实现所有目标,这是一种主观的方法。但是有些事情很重要:
1-如果您具有BLoC模式,则可以使用
Stream
方法直接分配onChanged
。2-使用
TextEditingController
,您可以在许多地方使用相同的 Controller 。您可以使用onChanged
实现相同的操作,但是当有人读取您的代码时,它看起来就像是变通方法,看起来像是破损的代码:)3-
onChanged
方法对于RegEx断言等也非常可行。与 Controller 相比,它看起来更加整洁。最后,我认为
onChanged
在大多数情况下对于模块化和更好的代码更好。正如我所说的,这完全取决于您,这一切我现在都想得到。关于flutter - TextEditingController与OnChanged,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56904313/