我正在寻找有关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/

10-10 07:02