【问题标题】:access Controller.isEmpty from another widget从另一个小部件访问 Controller.isEmpty
【发布时间】:2021-01-31 21:49:56
【问题描述】:

所以,我的主类中有一个文本小部件,我创建了另一个包含 TextFormField 的类。 根据文本字段是否为空,我想更改主类中文本的颜色。

如果我将文本字段与我的文本小部件放在同一个类中,我可以访问控制器以读取文本字段是否为空。

现在的问题是,当我将文本字段放在单独的类中时,我无法找到从主类访问该控制器的方法。

我在 Dart 内部传递数据方面遇到了很多困难,所以希望这会让我头脑清醒。

在同一个班级工作

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

我尝试使用“import '' as form”;并尝试使用 form.textfieldClass().txtFieldcontroller 访问它,但这似乎不起作用。

【问题讨论】:

    标签: flutter texteditingcontroller


    【解决方案1】:

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

    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)
              ],
            ),
          ),
        );
      }
    }
    

    【讨论】:

    • 太棒了,这似乎有效。让我进一步研究这一点,以了解导致此解决方案的各个方面。
    • 所以,我已经在我的项目中实现了解决方案代码。我注意到,在文本字段中的每次更改之后,整个上下文都会重新构建(因为它当然是一个 setState),是否有更有效的方法来设置文本小部件的状态?这是钥匙开始起作用的地方吗?我正在努力展示我迄今为止吸收的所有知识。
    • @Jaak 是的,这种方式效率很低,我只是为了演示。您可以将要重建的任何内容提取到有状态的小部件中并监听该小部件中的更改,因此它是唯一将被重建的小部件。并且可能实现一些逻辑以仅在必要时重建,而不是在每次更改时重建。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    相关资源
    最近更新 更多