在Flutter的StatelessWidget中使用TextEditingController可以吗?

时间:2020-04-25 12:55:29

标签: flutter flutter-layout

我不需要使用TextEditingController做很多事情,但想显示初始文本。我觉得为此创建StatefulWidget太过分了。 这就是我希望我的代码看起来像

// In StatelessWidget
TextField(
    controller: TextEditingController(),
)

但是我见过的每一篇教程和博客文章都在StatefulWidget中使用TextEditingController并将它们放在dispose方法中。但是,如果我像上面那样使用的话,我将无法处置它们。

1 个答案:

答案 0 :(得分:1)

如果您想使用TextEditingController,则除了要避免内存泄漏外,只能使用StatefulWidget

但是,如果您通过这种方法看到了很多样板,则可以使用HookWidgetflutter_hooks),它使您可以轻松访问TextEditingController并为您处理,这是一个比较:

使用StatefulWidget

class Test extends StatefulWidget {
  @override
  _TestState createState() => _TestState();
}

class _TestState extends State<Test> {
  TextEditingController controller;
  FocusNode focusNode;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Container(
          width: 200,
          height: 200,
          color: Colors.red,
          child: TextField(
            focusNode: focusNode,
            controller: controller,
          ),
        ),
      ),
    );
  }

  @override
  void initState() {
    controller = TextEditingController();
    focusNode = FocusNode();
    super.initState();
  }

  @override
  void dispose() {
    controller.dispose();
    focusNode.dispose();
    super.dispose();
  }
}

使用HookWidget

class Test extends HookWidget {
  @override
  Widget build(BuildContext context) {
    final focusNode = useFocusNode();
    final controller = useTextEditingController();
      return Scaffold(
      body: Center(
        child: Container(
          width: 200,
          height: 200,
          color: Colors.red,
          child: TextField(
            focusNode: focusNode,
            controller: controller,
          ),
        ),
      ),
    );
  }
}