从另一个小部件访问 Controller.isEmpty

access Controller.isEmpty from another widget

所以,我的主 class 中有一个文本小部件,我制作了另一个包含 TextFormField 的 class。 根据文本字段是否为空,我想更改主 class.

中文本的颜色

如果我将文本字段放在与我的文本小部件相同的 class 中,我就可以访问控制器以读出文本字段是否为空。

现在的问题是,当我将文本字段放在单独的 class 中时,我无法找到从主 class.

访问该控制器的方法

我在 Dart 中传入和传出数据时遇到了很多困难,所以希望这会启发我的思路。

在相同 class

时有效
child: Text(
       'This is a Text',
        style: TextStyle(
        color: txtFieldController.value.text.isEmpty? Colors.red : Colors.green,
        ),
),

我试过“导入''作为表单”;并尝试使用 form.textfieldClass().txtFieldcontroller 访问它,但这似乎不起作用。

在两个 classes 中为控制器创建一个 属性,在主 class 中创建控制器,然后将其传递给表单 class.

class MainWidget extends StatelessWidget {
  // create controller
  final  txtFieldController = TextEditingController();

  // pass the controller to the other class \/
  final formWidget = FormWidget(txtFieldController: txtFieldController);

  // ...
}

class FormWidget extends StatelessWidget {
  // create controller
  final TextEditingController txtFieldController;

  // ...
}

完整示例代码:
表单小部件

class FormWidget extends StatelessWidget {
  // create a property for the controller \/
  final TextEditingController txtFieldController;

  const FormWidget({Key key, this.txtFieldController}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Center(
      child: TextFormField(
        controller: txtFieldController,
      ),
    );
  }
}

主要小部件

class MainWidget extends StatefulWidget {
  @override
  _MainWidgetState createState() => _MainWidgetState();
}

class _MainWidgetState extends State<MainWidget> {
  final txtFieldController = TextEditingController();

  @override
  void initState() {
    // updates the widget on changes
    // note, the docs say: 'Avoid calling setState() high up in the tree if the change is contained to a small part of the tree.'
    // but it's not a big deal in this case
    txtFieldController.addListener(() {
      setState(() {});
    });
    super.initState();
  }

  @override
  void dispose() {
    txtFieldController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text(
              'This is a Text',
              style: TextStyle(
                color: txtFieldController.value.text.isEmpty ? Colors.red : Colors.green,
              ),
            ),
            // pass the controller to the other class \/
            FormWidget(txtFieldController: txtFieldController)
          ],
        ),
      ),
    );
  }
}