【问题标题】:Flutter: How to access property from it's state classFlutter:如何从它的状态类访问属性
【发布时间】:2020-06-08 15:26:20
【问题描述】:

我正在设计一个自定义文本字段

class MyTextField extends StatefulWidget {

   final String labelText;
   final TextEditingController textEditingController;

   String get text {
       // Expected compilation error: "Undefined name '_textEditingController'"
       return _textEditingController.text;
   }

    MyTextField({
        Key key,
        this.labelText,
        this.textEditingController,
        .....
        .....
      }) : super(key: key);
}

class _MyTextFieldState extends State<MyTextField> {
    TextEditingController _textEditingController = TextEditingController();

    @override
    void initState() {
       super.initState();
       _textEditingController = widget.editingController ?? TextEditingController();
    }

    @override
    Widget build(BuildContext context) {
        return Container(
          child: TextField(
            controller: _textEditingController,
            ....,
            ....,
          ),
       )
    }
}

我收到一个编译错误Undefined name '_textEditingController',这是因为_textEditingController 是在不同的类中定义的。

现在我的问题是如何访问_textEditingController 那里的属性?

希望从上面的代码 sn-ps 可以帮助你理解我想要实现的目标。

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    我认为这应该可以满足您的需求。在 Widget 中声明 Controller,因为您仍然可以从 State 访问 Widget 成员。只需确保在您的 getter 中使用 _textEdittingController 之前检查它是否具有值。

    class MyTextField extends StatefulWidget {
        TextEditingController _textEditingController = TextEditingController();
    
       final String labelText;
    
       String get title {
           // Error area
           return _textEditingController.text;
       }
    
        MyTextField({
            Key key,
            this.labelText,
          }) : super(key: key);
    
       _MyTextFieldState createState() => _MyTextFieldState();
    }
    
    class _MyTextFieldState extends State<MyTextField> {
    
        @override
        Widget build(BuildContext context) {
            return Container(
              child: TextField(
                controller: widget._textEditingController,
    
              ),
           );
        }
    }
    

    【讨论】:

    • 我已经用 initState 更新了代码 sn-ps。请检查一下。
    【解决方案2】:

    应该是其他方式。不是从状态到小部件,数据流应该是从小部件到状态。所以在 MyTextField 小部件中声明下面的代码。

    TextEditingController _textEditingController = TextEditingController();
    

    然后你可以像下面这样从状态类访问 _textEditingController:

    widget._textEditingController
    

    【讨论】:

    • 我需要相反方向的数据访问。请参考问题。
    • 应该有一个非常充分的理由来改变正常的流程,我可以知道你想要达到什么目的吗?
    • 我想使用 myTextField.text
    • 顺便说一句,您的小部件中应该有一个 createState() 方法!
    • 我明白了你的意思,但是 MyTextField 抱怨说“这个类(或这个类继承自的类)被标记为 '@immutable',但它的一个或多个实例字段不是”最终"
    猜你喜欢
    • 2019-04-14
    • 2021-05-19
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 2018-08-02
    • 1970-01-01
    • 2020-11-11
    相关资源
    最近更新 更多