Flutter:如何从状态类访问属性

时间:2020-06-08 15:26:20

标签: flutter dart

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

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属性?

以上代码段中的希望可以帮助您了解我要实现的目标。

2 个答案:

答案 0 :(得分:0)

我认为这应该做您想要的。在小部件中声明Controller,因为您仍然可以从State访问小部件成员。只需在使用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,

          ),
       );
    }
}

答案 1 :(得分:0)

应该反过来。不是从状态到小部件,数据流应该从小部件到状态。因此,在MyTextField小部件中声明以下代码。

TextEditingController _textEditingController = TextEditingController();

然后您可以从状态类访问_textEditingController,如下所示:

widget._textEditingController